diff --git a/solutions/10/README.md b/solutions/10/README.md new file mode 100644 index 0000000..c37adf0 --- /dev/null +++ b/solutions/10/README.md @@ -0,0 +1,11 @@ +# 10 + +The first one is really easy. Just sort, make the diff and count. + +
+ Solutions +
    +
  1. 2475
  2. +
  3. 442136281481216
  4. +
+
diff --git a/solutions/10/python/main.py b/solutions/10/python/main.py new file mode 100644 index 0000000..af3dc94 --- /dev/null +++ b/solutions/10/python/main.py @@ -0,0 +1,54 @@ +from os.path import join, dirname +from typing import List, Optional, Set, Tuple +from itertools import combinations, count +from math import floor, prod + + +def parse(s: str) -> List[int]: + numbers: List[int] = sorted(map(int, s.strip().split('\n'))) + numbers.insert(0, 0) # The wall + numbers.append(numbers[-1] + 3) # Phone itself + return numbers + + +def diff(l: List[int]) -> List[int]: + return [ + l[x] - l[x-1] + for x in range(1, len(l)) + ] + + +def calc(d: List[int]) -> int: + one = d.count(1) + three = d.count(3) + return one * three + + +def find_valid_permutations(d: List[int]) -> int: + i = 0 + l = len(d) + slices: List[int] = [] + while i < l: + if d[i] != 3: + try: + n = d.index(3, i + 1) # Find the next three + diff = n - i + if diff > 1: + slices.append(diff) + i = n + continue + except: + pass + i += 1 + return prod([ + 2**(s-1) - floor(s/4) + for s in slices + ]) + + +data = join(dirname(__file__), '../data.txt') +with open(data) as f: + numbers: List[int] = parse(f.read()) + d = diff(numbers) + print(calc(d)) + print(find_valid_permutations(d))