summaryrefslogtreecommitdiffstats
path: root/day1/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'day1/__init__.py')
-rw-r--r--day1/__init__.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/day1/__init__.py b/day1/__init__.py
new file mode 100644
index 0000000..6e95329
--- /dev/null
+++ b/day1/__init__.py
@@ -0,0 +1,60 @@
1# -*- coding: utf-8 -*-
2from abc import ABC
3from typing import Iterator
4
5from aoc import BaseAssignment, I
6
7
8class Assignment(BaseAssignment, ABC):
9 def parse_item(self, item: str) -> Iterator[I]:
10 [rotation, *places] = item
11 places = int("".join(places))
12
13 yield -places if rotation == "L" else places
14
15
16class AssignmentOne(Assignment):
17 example_result = 3
18
19 def run(self, input: Iterator[int]) -> int:
20 seen_0 = 0
21 position = 50
22 for rotation in input:
23 position = (position + rotation) % 100
24 if position == 0:
25 seen_0 += 1
26
27 return seen_0
28
29
30class AssignmentTwo(Assignment):
31 example_result = 6
32
33 @staticmethod
34 def calculate_new_position(position, rotation) -> tuple[int, int]:
35 previous_position = position
36 new_position = position + rotation
37
38 overturned = new_position >= 100 or new_position < 0
39
40 multiplier = position - (0 - -previous_position) // 100
41
42 if overturned:
43 new_position = new_position % 100
44
45 seen_0 = 0
46 if new_position == 0 and multiplier == 0:
47 seen_0 += multiplier + 1
48 elif overturned:
49 seen_0 += multiplier
50
51 return new_position, seen_0
52
53 def run(self, input: Iterator[int]) -> int:
54 seen_0_total = 0
55 position = 50
56 for rotation in input:
57 position, seen_0 = self.calculate_new_position(position, rotation)
58 seen_0_total += seen_0
59
60 return seen_0_total