summaryrefslogtreecommitdiffstats
path: root/day20/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'day20/__init__.py')
-rw-r--r--day20/__init__.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/day20/__init__.py b/day20/__init__.py
new file mode 100644
index 0000000..02ff80d
--- /dev/null
+++ b/day20/__init__.py
@@ -0,0 +1,61 @@
1# -*- coding: utf-8 -*-
2from abc import ABC
3from collections import OrderedDict
4from typing import Iterator, List
5
6from aoc import BaseAssignment, I, T
7
8
9class Assignment(BaseAssignment[int, int], ABC):
10 def parse_item(self, item: str) -> int:
11 return int(item)
12
13
14class AssignmentOne(Assignment):
15 example_result = 3
16
17 @staticmethod
18 def move(items: List[int], item: int):
19 items = list(items)
20 input_size = len(items)
21
22 index = items.index(item)
23 item = items.pop(index)
24
25 new_index = (index + item) % input_size
26
27 if item > 0 and index + item >= input_size:
28 new_index += 1
29
30 if item < 0 and index + item <= 0:
31 new_index -= 1
32
33 items.insert(new_index, item)
34
35 return items
36
37 def run(self, input: Iterator[I]) -> T:
38 input_list = list(input)
39 input_size = len(input_list)
40 working_list = list(input_list)
41
42 for index, item in enumerate(input_list):
43 working_list = self.move(working_list, item)
44
45 print(
46 working_list[1000 % input_size],
47 working_list[2000 % input_size],
48 working_list[3000 % input_size],
49 )
50
51 return sum(
52 [
53 working_list[1000 % input_size],
54 working_list[2000 % input_size],
55 working_list[3000 % input_size],
56 ]
57 )
58
59
60class AssignmentTwo(Assignment):
61 pass