summaryrefslogtreecommitdiffstats
path: root/day9/__init__.py
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@ScaryTerry.local>2020-12-15 13:14:58 +0100
committerGravatar Tom van der Lee <tom@ScaryTerry.local>2020-12-15 13:14:58 +0100
commit37aa8eec0498d7e8491084711132f16db9129a39 (patch)
treebfcf5bd4a5fe3d6a364db2ea2b65d60112d879a8 /day9/__init__.py
parent9d38cb75c2e23a173adc7e390777c50361c31436 (diff)
download2021-37aa8eec0498d7e8491084711132f16db9129a39.tar.gz
2021-37aa8eec0498d7e8491084711132f16db9129a39.tar.bz2
2021-37aa8eec0498d7e8491084711132f16db9129a39.zip
Added day 9
Diffstat (limited to 'day9/__init__.py')
-rw-r--r--day9/__init__.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/day9/__init__.py b/day9/__init__.py
new file mode 100644
index 0000000..0cf3770
--- /dev/null
+++ b/day9/__init__.py
@@ -0,0 +1,63 @@
1from typing import Any, Iterator, List
2
3from aoc import BaseAssignment
4
5
6class Assignment(BaseAssignment):
7 def __init__(self, path, preamble_length=25):
8 super().__init__(path)
9 self.preamble_length = int(preamble_length)
10
11 def read_input(self, example=False) -> List:
12 return list(super(Assignment, self).read_input(example))
13
14 def parse_item(self, item: str) -> Any:
15 return int(item)
16
17
18class AssignmentOne(Assignment):
19 def find_invalid(self, input: List, preamble_length: int = 25) -> int:
20 preamble = sorted(input[:preamble_length])
21 to_check = input[preamble_length]
22
23 front_position = 0
24 end_position = preamble_length - 1
25
26 while True:
27 if front_position is end_position:
28 return to_check
29
30 sum = preamble[front_position] + preamble[end_position]
31
32 if sum > to_check:
33 end_position -= 1
34 elif sum < to_check:
35 front_position += 1
36 else:
37 break
38
39 return self.find_invalid(input[1:], preamble_length=preamble_length)
40
41 def run(self, input: List) -> int:
42 return self.find_invalid(
43 input, preamble_length=int(self.preamble_length))
44
45
46class AssignmentTwo(AssignmentOne):
47 def find_weakness(self, input: List, invalid_nr: int) -> int:
48 for index, current_num in enumerate(input):
49 if index < 2:
50 continue
51
52 items_to_check = input[:index]
53 sum_list = sum(items_to_check)
54
55 if sum_list > invalid_nr:
56 break
57 elif sum_list == invalid_nr:
58 return min(items_to_check) + max(items_to_check)
59
60 return self.find_weakness(input[1:], invalid_nr)
61
62 def run(self, input: List) -> int:
63 return self.find_weakness(input, super().run(input))