summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <t0m.vd.l33@gmail.com>2022-12-05 10:26:45 +0100
committerGravatar Tom van der Lee <t0m.vd.l33@gmail.com>2022-12-05 10:26:45 +0100
commit8b9919f784f93bdca7335354e7eea782b397fe0c (patch)
tree39100eada8e973faf4c5e7bf48f3e94b57f5c6e2
parent87f25f31adcc1a90bd99d40c5790290ecbcd7ce0 (diff)
download2022-8b9919f784f93bdca7335354e7eea782b397fe0c.tar.gz
2022-8b9919f784f93bdca7335354e7eea782b397fe0c.tar.bz2
2022-8b9919f784f93bdca7335354e7eea782b397fe0c.zip
Day 5
-rw-r--r--aoc/__init__.py2
-rw-r--r--day5/__init__.py108
-rw-r--r--day5/example.txt9
-rw-r--r--day5/input.txt512
4 files changed, 630 insertions, 1 deletions
diff --git a/aoc/__init__.py b/aoc/__init__.py
index 5fce415..3662e3a 100644
--- a/aoc/__init__.py
+++ b/aoc/__init__.py
@@ -23,7 +23,7 @@ class BaseAssignment(ABC):
23 23
24 with open(file, "r") as input_file: 24 with open(file, "r") as input_file:
25 for line in input_file.readlines(): 25 for line in input_file.readlines():
26 yield self.parse_item(line.strip()) 26 yield self.parse_item(line.strip("\n"))
27 27
28 def run(self, input: Iterator) -> Any: 28 def run(self, input: Iterator) -> Any:
29 raise NotImplementedError("Please implement run") 29 raise NotImplementedError("Please implement run")
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
130move 2 from 6 to 3
131move 9 from 5 to 7
132move 3 from 1 to 6
133move 3 from 3 to 7
134move 5 from 5 to 9
135move 3 from 6 to 2
136move 1 from 6 to 2
137move 12 from 8 to 2
138move 5 from 2 to 1
139move 2 from 1 to 3
140move 25 from 7 to 1
141move 1 from 4 to 6
142move 2 from 3 to 9
143move 26 from 1 to 9
144move 2 from 1 to 8
145move 1 from 6 to 8
146move 1 from 7 to 1
147move 7 from 8 to 1
148move 7 from 1 to 5
149move 1 from 1 to 2
150move 2 from 8 to 6
151move 32 from 9 to 8
152move 1 from 6 to 5
153move 5 from 2 to 9
154move 1 from 9 to 7
155move 24 from 8 to 3
156move 1 from 6 to 9
157move 3 from 2 to 5
158move 1 from 7 to 9
159move 4 from 9 to 3
160move 8 from 8 to 7
161move 18 from 3 to 7
162move 20 from 7 to 8
163move 6 from 8 to 9
164move 6 from 5 to 1
165move 8 from 9 to 4
166move 3 from 5 to 4
167move 8 from 8 to 4
168move 2 from 5 to 2
169move 3 from 1 to 5
170move 4 from 3 to 7
171move 6 from 2 to 9
172move 3 from 3 to 6
173move 6 from 4 to 5
174move 2 from 6 to 3
175move 1 from 3 to 1
176move 4 from 3 to 8
177move 8 from 4 to 3
178move 4 from 3 to 7
179move 4 from 4 to 5
180move 4 from 9 to 5
181move 3 from 3 to 4
182move 3 from 4 to 9
183move 1 from 1 to 4
184move 2 from 1 to 5
185move 7 from 7 to 8
186move 4 from 7 to 4
187move 1 from 6 to 7
188move 1 from 1 to 5
189move 1 from 3 to 8
190move 11 from 5 to 9
191move 17 from 9 to 8
192move 13 from 8 to 4
193move 1 from 4 to 8
194move 4 from 7 to 1
195move 4 from 8 to 3
196move 6 from 5 to 4
197move 3 from 3 to 6
198move 2 from 1 to 9
199move 1 from 9 to 5
200move 1 from 3 to 5
201move 5 from 5 to 9
202move 2 from 1 to 8
203move 21 from 8 to 6
204move 2 from 8 to 4
205move 4 from 9 to 6
206move 1 from 9 to 7
207move 19 from 4 to 1
208move 28 from 6 to 5
209move 7 from 4 to 2
210move 28 from 5 to 3
211move 1 from 9 to 4
212move 1 from 4 to 2
213move 1 from 7 to 8
214move 1 from 8 to 9
215move 13 from 1 to 3
216move 8 from 2 to 8
217move 3 from 1 to 2
218move 5 from 8 to 5
219move 1 from 2 to 7
220move 1 from 9 to 7
221move 1 from 2 to 3
222move 2 from 7 to 9
223move 1 from 2 to 6
224move 1 from 9 to 1
225move 9 from 3 to 9
226move 3 from 9 to 1
227move 1 from 6 to 8
228move 21 from 3 to 7
229move 7 from 9 to 4
230move 2 from 4 to 2
231move 1 from 8 to 6
232move 7 from 1 to 4
233move 7 from 7 to 8
234move 4 from 5 to 9
235move 10 from 7 to 1
236move 7 from 3 to 9
237move 1 from 7 to 9
238move 1 from 5 to 3
239move 3 from 3 to 5
240move 10 from 4 to 2
241move 1 from 3 to 7
242move 2 from 4 to 9
243move 3 from 9 to 1
244move 3 from 7 to 1
245move 1 from 6 to 4
246move 1 from 1 to 2
247move 1 from 3 to 4
248move 2 from 4 to 3
249move 1 from 7 to 4
250move 4 from 8 to 9
251move 1 from 4 to 9
252move 3 from 1 to 9
253move 12 from 1 to 7
254move 2 from 9 to 5
255move 12 from 9 to 7
256move 5 from 5 to 1
257move 1 from 8 to 5
258move 4 from 1 to 4
259move 1 from 9 to 6
260move 1 from 3 to 4
261move 3 from 8 to 3
262move 1 from 1 to 7
263move 8 from 2 to 5
264move 2 from 8 to 1
265move 10 from 7 to 1
266move 4 from 9 to 5
267move 2 from 5 to 8
268move 11 from 5 to 4
269move 6 from 7 to 2
270move 2 from 2 to 1
271move 1 from 7 to 5
272move 1 from 5 to 1
273move 2 from 4 to 8
274move 1 from 6 to 9
275move 8 from 4 to 3
276move 8 from 1 to 7
277move 7 from 1 to 2
278move 4 from 3 to 9
279move 1 from 9 to 6
280move 7 from 2 to 1
281move 5 from 2 to 3
282move 2 from 7 to 8
283move 5 from 8 to 4
284move 2 from 9 to 3
285move 1 from 8 to 1
286move 6 from 3 to 5
287move 10 from 3 to 1
288move 3 from 5 to 3
289move 3 from 2 to 1
290move 1 from 5 to 4
291move 6 from 4 to 5
292move 1 from 6 to 2
293move 3 from 4 to 7
294move 1 from 9 to 4
295move 2 from 3 to 1
296move 1 from 9 to 8
297move 1 from 3 to 7
298move 4 from 4 to 8
299move 2 from 7 to 4
300move 8 from 5 to 9
301move 2 from 8 to 6
302move 2 from 4 to 3
303move 2 from 3 to 4
304move 4 from 9 to 7
305move 1 from 8 to 7
306move 2 from 6 to 9
307move 2 from 8 to 9
308move 1 from 2 to 9
309move 1 from 7 to 8
310move 1 from 2 to 7
311move 19 from 7 to 6
312move 1 from 8 to 1
313move 2 from 4 to 8
314move 5 from 6 to 1
315move 2 from 7 to 2
316move 2 from 2 to 8
317move 2 from 1 to 8
318move 4 from 8 to 2
319move 3 from 2 to 8
320move 6 from 9 to 5
321move 8 from 6 to 3
322move 26 from 1 to 6
323move 1 from 5 to 3
324move 1 from 1 to 5
325move 8 from 3 to 1
326move 1 from 3 to 7
327move 3 from 9 to 2
328move 4 from 2 to 6
329move 26 from 6 to 1
330move 1 from 7 to 5
331move 3 from 8 to 4
332move 2 from 8 to 2
333move 7 from 1 to 2
334move 1 from 5 to 9
335move 2 from 4 to 6
336move 9 from 6 to 2
337move 18 from 1 to 7
338move 6 from 7 to 1
339move 6 from 5 to 6
340move 1 from 1 to 2
341move 19 from 2 to 7
342move 1 from 4 to 2
343move 9 from 7 to 1
344move 3 from 6 to 7
345move 1 from 9 to 4
346move 1 from 2 to 3
347move 8 from 7 to 8
348move 4 from 6 to 5
349move 2 from 6 to 3
350move 1 from 4 to 2
351move 4 from 5 to 1
352move 8 from 8 to 7
353move 17 from 7 to 8
354move 3 from 3 to 1
355move 1 from 2 to 8
356move 8 from 8 to 4
357move 8 from 8 to 7
358move 1 from 8 to 2
359move 7 from 7 to 6
360move 1 from 2 to 7
361move 5 from 7 to 8
362move 7 from 1 to 6
363move 10 from 6 to 1
364move 4 from 7 to 9
365move 3 from 9 to 7
366move 1 from 7 to 2
367move 6 from 4 to 2
368move 7 from 1 to 5
369move 4 from 2 to 5
370move 16 from 1 to 9
371move 3 from 2 to 7
372move 2 from 4 to 9
373move 4 from 1 to 6
374move 5 from 7 to 4
375move 4 from 6 to 3
376move 1 from 7 to 4
377move 1 from 6 to 9
378move 1 from 8 to 5
379move 4 from 3 to 2
380move 2 from 5 to 3
381move 3 from 6 to 2
382move 3 from 2 to 1
383move 9 from 5 to 8
384move 1 from 3 to 1
385move 10 from 8 to 1
386move 1 from 8 to 5
387move 16 from 9 to 2
388move 1 from 3 to 2
389move 12 from 1 to 9
390move 1 from 9 to 2
391move 3 from 1 to 6
392move 2 from 1 to 9
393move 3 from 6 to 8
394move 20 from 2 to 7
395move 16 from 9 to 7
396move 1 from 7 to 5
397move 2 from 5 to 9
398move 2 from 2 to 3
399move 2 from 8 to 5
400move 3 from 9 to 7
401move 2 from 5 to 2
402move 1 from 4 to 6
403move 2 from 1 to 4
404move 23 from 7 to 5
405move 4 from 8 to 5
406move 7 from 7 to 1
407move 16 from 5 to 7
408move 1 from 6 to 5
409move 1 from 2 to 4
410move 2 from 3 to 9
411move 1 from 2 to 3
412move 13 from 5 to 1
413move 1 from 3 to 8
414move 1 from 9 to 4
415move 19 from 1 to 9
416move 2 from 1 to 9
417move 22 from 9 to 8
418move 14 from 8 to 5
419move 12 from 5 to 3
420move 21 from 7 to 9
421move 14 from 9 to 7
422move 1 from 8 to 6
423move 9 from 3 to 7
424move 1 from 3 to 2
425move 4 from 4 to 1
426move 1 from 2 to 4
427move 1 from 3 to 9
428move 6 from 8 to 9
429move 4 from 1 to 7
430move 2 from 5 to 9
431move 6 from 4 to 5
432move 4 from 7 to 4
433move 1 from 5 to 3
434move 5 from 9 to 7
435move 2 from 3 to 1
436move 6 from 9 to 6
437move 1 from 1 to 6
438move 2 from 4 to 2
439move 8 from 7 to 5
440move 20 from 7 to 5
441move 2 from 5 to 6
442move 4 from 9 to 5
443move 1 from 1 to 3
444move 1 from 3 to 4
445move 1 from 2 to 7
446move 1 from 4 to 9
447move 9 from 6 to 3
448move 2 from 4 to 3
449move 28 from 5 to 3
450move 1 from 8 to 3
451move 1 from 8 to 1
452move 1 from 2 to 8
453move 1 from 6 to 2
454move 1 from 8 to 1
455move 6 from 5 to 7
456move 1 from 5 to 1
457move 1 from 9 to 2
458move 1 from 1 to 3
459move 1 from 9 to 7
460move 2 from 1 to 2
461move 11 from 3 to 8
462move 3 from 8 to 6
463move 3 from 6 to 9
464move 25 from 3 to 7
465move 4 from 3 to 8
466move 4 from 2 to 3
467move 9 from 8 to 9
468move 2 from 3 to 7
469move 3 from 8 to 2
470move 11 from 9 to 7
471move 1 from 9 to 1
472move 4 from 7 to 3
473move 1 from 1 to 5
474move 23 from 7 to 2
475move 12 from 2 to 3
476move 2 from 3 to 9
477move 12 from 2 to 1
478move 2 from 3 to 9
479move 1 from 5 to 4
480move 1 from 2 to 5
481move 1 from 9 to 4
482move 1 from 5 to 9
483move 2 from 4 to 2
484move 3 from 1 to 4
485move 1 from 2 to 1
486move 10 from 3 to 2
487move 7 from 7 to 3
488move 11 from 7 to 9
489move 5 from 3 to 1
490move 1 from 4 to 5
491move 11 from 2 to 3
492move 9 from 9 to 3
493move 3 from 9 to 4
494move 2 from 4 to 8
495move 1 from 5 to 6
496move 13 from 1 to 5
497move 3 from 3 to 8
498move 3 from 7 to 2
499move 1 from 7 to 4
500move 3 from 8 to 3
501move 8 from 3 to 8
502move 4 from 4 to 5
503move 2 from 8 to 2
504move 8 from 8 to 3
505move 1 from 6 to 3
506move 2 from 2 to 8
507move 6 from 5 to 2
508move 3 from 2 to 8
509move 1 from 1 to 7
510move 2 from 9 to 3
511move 3 from 5 to 4
512move 2 from 8 to 6