From be938144bf314f8b3cc3fb784d6b26233c13480f Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Thu, 10 Dec 2020 15:17:09 +0100 Subject: [PATCH] Day 10 --- day10/input.txt | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ day10/part1.py | 14 +++++++ day10/part2.py | 44 +++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 day10/input.txt create mode 100644 day10/part1.py create mode 100644 day10/part2.py diff --git a/day10/input.txt b/day10/input.txt new file mode 100644 index 0000000..5746f73 --- /dev/null +++ b/day10/input.txt @@ -0,0 +1,102 @@ +103 +131 +121 +151 +118 +12 +7 +2 +90 +74 +160 +58 +15 +83 +153 +140 +166 +1 +148 +33 +165 +39 +100 +135 +68 +77 +25 +9 +54 +94 +101 +55 +141 +22 +97 +35 +57 +117 +102 +64 +109 +114 +56 +51 +125 +82 +154 +142 +155 +45 +75 +158 +120 +5 +19 +61 +34 +128 +106 +88 +84 +137 +96 +136 +27 +6 +21 +89 +69 +162 +112 +127 +119 +161 +38 +42 +134 +20 +81 +48 +73 +87 +26 +95 +146 +113 +76 +32 +70 +8 +18 +67 +124 +80 +93 +29 +126 +147 +28 +152 +145 +159 diff --git a/day10/part1.py b/day10/part1.py new file mode 100644 index 0000000..eb8a8df --- /dev/null +++ b/day10/part1.py @@ -0,0 +1,14 @@ +import numpy as np + +lines = sorted(int(x.strip()) for x in open("input.txt")) + +lines.append(lines[-1]+3) +lines.insert(0, 0) +lines = np.array(lines) + +diff = lines[1:] - lines[:-1] +unique, counts = np.unique(diff, return_counts=True) +cnt = dict(zip(unique, counts)) + +print(cnt) +print(cnt[1]*cnt[3]) diff --git a/day10/part2.py b/day10/part2.py new file mode 100644 index 0000000..b2edb2d --- /dev/null +++ b/day10/part2.py @@ -0,0 +1,44 @@ +import numpy as np +import operator +from functools import reduce + +lines = sorted(int(x.strip()) for x in open("input.txt")) + +lines.append(lines[-1]+3) +lines.insert(0, 0) +lines = np.array(lines) + +diff = lines[1:] - lines[:-1] + +one_count = 0 +possibilities = [] + +one_cache = {} + + +def count_one_possibilities(one_cnt: int): + if one_cnt not in one_cache: + if one_cnt <= 1: + one_cache[one_cnt] = 1 + else: + one_cache[one_cnt] = sum(count_one_possibilities(less) for less in range(max(0, one_cnt - 3), one_cnt)) + return one_cache[one_cnt] + + +def prod(iterable): + return reduce(operator.mul, iterable, 1) + + +# only 3 and 1 differences are available +# 3 has to be taken / calculate possibilities for 1 hops +for num in diff: + if num == 1: + one_count += 1 + elif num == 3: + factor = count_one_possibilities(one_count) + if factor > 1: + possibilities.append(factor) + one_count = 0 + +print(prod(possibilities)) # 64793042714624 +print(one_cache) # {0: 1, 1: 1, 2: 2, 3: 4, 4: 7}