summaryrefslogtreecommitdiffstats
path: root/day5
diff options
context:
space:
mode:
Diffstat (limited to 'day5')
-rw-r--r--day5/__init__.py108
-rw-r--r--day5/example.txt9
-rw-r--r--day5/input.txt512
3 files changed, 629 insertions, 0 deletions
diff --git a/day5/__init__.py b/day5/__init__.py
new file mode 100644
index 0000000..a9aaba5
--- /dev/null
+++ b/day5/__init__.py
@@ -0,0 +1,108 @@
1# -*- coding: utf-8 -*-
2import re
3from abc import ABC
4from typing import Iterator, Any, TypedDict, Tuple, List
5from queue import LifoQueue
6
7from aoc import BaseAssignment
8
9move_regex = re.compile("^move (?P<amount>\d+) from (?P<start>\d+) to (?P<end>\d+)$")
10
11
12class Move(TypedDict):
13 amount: int
14 start: int
15 end: int
16
17
18class Assignment(BaseAssignment, ABC):
19 def parse_move(self, move: str) -> Move:
20 match = move_regex.match(move)
21 if match:
22 move = match.groupdict()
23 return Move(
24 amount=int(move["amount"]),
25 start=int(move["start"]),
26 end=int(move["end"]),
27 )
28
29 def parse_stacks(self, string_stacks: List[str]) -> List[LifoQueue]:
30 stacks = []
31 columns = string_stacks.pop().replace(" ", "")
32
33 for i in range(len(columns)):
34 stacks.append(LifoQueue())
35
36 for line in reversed(string_stacks):
37 for index, stack in enumerate(stacks):
38 item_index = (index * 4) + 1
39
40 try:
41 item = line[item_index]
42 if item != " ":
43 stack.put(item)
44 except IndexError:
45 pass
46
47 return stacks
48
49 def parse_input(self, input: Iterator) -> Tuple[List[LifoQueue], List[Move]]:
50 parsing_stacks = True
51 tmp_stacks = []
52 stacks = []
53 moves = []
54
55 for line in input:
56 if line == "":
57 parsing_stacks = False
58 stacks = self.parse_stacks(tmp_stacks)
59 continue
60
61 if parsing_stacks:
62 tmp_stacks.append(line)
63 else:
64 moves.append(self.parse_move(line))
65
66 return stacks, moves
67
68 def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]):
69 raise NotImplementedError()
70
71 def run(self, input: Iterator) -> Any:
72 stacks, moves = self.parse_input(input)
73
74 self.execute_moves(stacks, moves)
75
76 return "".join([stack.get() for stack in stacks])
77
78
79class AssignmentOne(Assignment):
80 example_result = "CMZ"
81
82 def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]):
83 for move in moves:
84 start = stacks[move["start"] - 1]
85 end = stacks[move["end"] - 1]
86
87 for _ in range(move["amount"]):
88 end.put(start.get())
89
90 return stacks
91
92
93class AssignmentTwo(Assignment):
94 example_result = "MCD"
95
96 def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]):
97 for move in moves:
98 start = stacks[move["start"] - 1]
99 end = stacks[move["end"] - 1]
100
101 tmp_stack = LifoQueue()
102 for _ in range(move["amount"]):
103 tmp_stack.put(start.get())
104
105 while not tmp_stack.empty():
106 end.put(tmp_stack.get())
107
108 return stacks
diff --git a/day5/example.txt b/day5/example.txt
new file mode 100644
index 0000000..42ef47f
--- /dev/null
+++ b/day5/example.txt
@@ -0,0 +1,9 @@
1 [D]
2[N] [C]
3[Z] [M] [P]
4 1 2 3
5
6move 1 from 2 to 1
7move 3 from 1 to 3
8move 2 from 2 to 1
9move 1 from 1 to 2
diff --git a/day5/input.txt b/day5/input.txt
new file mode 100644
index 0000000..54a285f
--- /dev/null
+++ b/day5/input.txt
@@ -0,0 +1,512 @@
1[F] [L] [M]
2[T] [H] [V] [G] [V]
3[N] [T] [D] [R] [N] [D]
4[Z] [B] [C] [P] [B] [R] [Z]
5[M] [J] [N] [M] [F] [M] [V] [H]
6[G] [J] [L] [J] [S] [C] [G] [M] [F]
7[H] [W] [V] [P] [W] [H] [H] [N] [N]
8[J] [V] [G] [B] [F] [G] [D] [H] [G]
9 1 2 3 4 5 6 7 8 9
10
11move 6 from 4 to 3
12move 5 from 8 to 9
13move 1 from 4 to 5
14move 1 from 4 to 5
15move 2 from 2 to 7
16move 2 from 1 to 6
17move 9 from 6 to 1
18move 12 from 3 to 5
19move 1 from 8 to 4
20move 3 from 1 to 5
21move 1 from 6 to 7
22move 10 from 5 to 2
23move 14 from 5 to 1
24move 8 from 7 to 9
25move 11 from 2 to 9
26move 1 from 3 to 9
27move 11 from 1 to 5
28move 2 from 1 to 9
29move 1 from 4 to 8
30move 6 from 1 to 5
31move 1 from 8 to 3
32move 16 from 5 to 1
33move 4 from 1 to 3
34move 1 from 5 to 6
35move 4 from 3 to 4
36move 1 from 6 to 7
37move 21 from 9 to 6
38move 2 from 1 to 9
39move 2 from 4 to 9
40move 5 from 9 to 4
41move 9 from 1 to 6
42move 6 from 4 to 6
43move 1 from 6 to 2
44move 1 from 7 to 6
45move 1 from 3 to 2
46move 8 from 6 to 9
47move 3 from 1 to 8
48move 1 from 2 to 1
49move 13 from 6 to 3
50move 1 from 1 to 9
51move 2 from 1 to 6
52move 3 from 8 to 4
53move 4 from 4 to 9
54move 3 from 1 to 3
55move 22 from 9 to 8
56move 1 from 2 to 9
57move 6 from 8 to 9
58move 15 from 6 to 5
59move 5 from 8 to 9
60move 11 from 9 to 8
61move 13 from 5 to 1
62move 1 from 6 to 5
63move 1 from 9 to 3
64move 21 from 8 to 3
65move 3 from 5 to 3
66move 11 from 1 to 2
67move 25 from 3 to 1
68move 5 from 1 to 7
69move 20 from 1 to 7
70move 1 from 6 to 7
71move 16 from 3 to 9
72move 8 from 9 to 6
73move 1 from 1 to 5
74move 5 from 9 to 4
75move 2 from 2 to 1
76move 2 from 9 to 4
77move 1 from 9 to 4
78move 1 from 8 to 4
79move 1 from 5 to 2
80move 3 from 4 to 6
81move 1 from 4 to 7
82move 9 from 7 to 6
83move 5 from 4 to 6
84move 7 from 7 to 2
85move 1 from 1 to 6
86move 11 from 2 to 5
87move 10 from 5 to 1
88move 1 from 6 to 8
89move 1 from 5 to 7
90move 24 from 6 to 1
91move 12 from 1 to 4
92move 12 from 4 to 8
93move 2 from 2 to 7
94move 3 from 7 to 2
95move 5 from 2 to 8
96move 9 from 8 to 9
97move 9 from 8 to 5
98move 1 from 9 to 1
99move 14 from 1 to 8
100move 11 from 7 to 9
101move 4 from 1 to 3
102move 7 from 1 to 2
103move 3 from 3 to 7
104move 12 from 9 to 7
105move 8 from 7 to 2
106move 4 from 9 to 2
107move 1 from 3 to 6
108move 5 from 5 to 9
109move 14 from 2 to 1
110move 8 from 9 to 4
111move 6 from 4 to 5
112move 5 from 5 to 7
113move 1 from 8 to 2
114move 2 from 4 to 6
115move 4 from 7 to 3
116move 10 from 8 to 4
117move 2 from 3 to 6
118move 7 from 7 to 6
119move 10 from 4 to 8
120move 5 from 1 to 6
121move 8 from 2 to 1
122move 7 from 6 to 8
123move 9 from 6 to 5
124move 16 from 1 to 6
125move 2 from 3 to 9
126move 1 from 7 to 4
127move 2 from 9 to 1
128move 14 from 6 to 7
129move 1 from 6 to 3