aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrfeas Chatzipanagiotis <csd4366@csd.uoc.gr>2022-12-09 04:40:44 +0200
committerOrfeas Chatzipanagiotis <csd4366@csd.uoc.gr>2022-12-09 11:57:39 +0200
commit661ae7a8b4e0601aae8bfbf1708b894b4ade2b4d (patch)
tree97b9f3e00af1c208cf4c43b5dd79cd8cf59919b9
parentDay 3,4 (diff)
downloadaoc22-661ae7a8b4e0601aae8bfbf1708b894b4ade2b4d.tar.gz
aoc22-661ae7a8b4e0601aae8bfbf1708b894b4ade2b4d.zip
Day 5
-rw-r--r--day5/example.txt9
-rw-r--r--day5/input.txt512
-rw-r--r--day5/solution.nim87
3 files changed, 608 insertions, 0 deletions
diff --git a/day5/example.txt b/day5/example.txt
new file mode 100644
index 0000000..84933bb
--- /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..988dbdd
--- /dev/null
+++ b/day5/input.txt
@@ -0,0 +1,512 @@
1 [V] [C] [M]
2[V] [J] [N] [H] [V]
3[R] [F] [N] [W] [Z] [N]
4[H] [R] [D] [Q] [M] [L] [B]
5[B] [C] [H] [V] [R] [C] [G] [R]
6[G] [G] [F] [S] [D] [H] [B] [R] [S]
7[D] [N] [S] [D] [H] [G] [J] [J] [G]
8[W] [J] [L] [J] [S] [P] [F] [S] [L]
9 1 2 3 4 5 6 7 8 9
10
11move 2 from 2 to 7
12move 8 from 5 to 6
13move 2 from 4 to 5
14move 1 from 4 to 5
15move 1 from 5 to 8
16move 5 from 9 to 2
17move 7 from 1 to 6
18move 7 from 3 to 8
19move 1 from 4 to 6
20move 2 from 5 to 6
21move 6 from 7 to 5
22move 2 from 2 to 4
23move 4 from 5 to 2
24move 10 from 8 to 1
25move 2 from 7 to 4
26move 4 from 2 to 8
27move 2 from 9 to 8
28move 1 from 8 to 4
29move 2 from 4 to 9
30move 5 from 8 to 2
31move 1 from 4 to 6
32move 1 from 8 to 9
33move 1 from 7 to 2
34move 2 from 4 to 2
35move 1 from 7 to 3
36move 13 from 2 to 1
37move 1 from 2 to 4
38move 1 from 2 to 3
39move 2 from 5 to 4
40move 17 from 6 to 4
41move 3 from 4 to 9
42move 14 from 1 to 4
43move 4 from 6 to 8
44move 1 from 9 to 8
45move 23 from 4 to 8
46move 6 from 1 to 7
47move 3 from 1 to 5
48move 1 from 3 to 8
49move 5 from 7 to 8
50move 1 from 3 to 4
51move 1 from 5 to 3
52move 1 from 5 to 1
53move 1 from 3 to 2
54move 1 from 9 to 4
55move 9 from 4 to 9
56move 1 from 1 to 2
57move 11 from 8 to 2
58move 1 from 4 to 5
59move 13 from 2 to 3
60move 7 from 9 to 6
61move 1 from 5 to 6
62move 1 from 5 to 2
63move 1 from 9 to 4
64move 1 from 4 to 9
65move 2 from 8 to 9
66move 1 from 7 to 8
67move 8 from 9 to 1
68move 8 from 1 to 4
69move 4 from 6 to 7
70move 1 from 9 to 4
71move 2 from 3 to 9
72move 1 from 9 to 1
73move 6 from 4 to 1
74move 2 from 1 to 3
75move 22 from 8 to 6
76move 1 from 2 to 5
77move 3 from 7 to 8
78move 15 from 6 to 4
79move 7 from 3 to 7
80move 4 from 6 to 9
81move 2 from 9 to 2
82move 6 from 3 to 5
83move 3 from 9 to 5
84move 5 from 5 to 8
85move 1 from 2 to 1
86move 6 from 8 to 2
87move 1 from 1 to 2
88move 3 from 5 to 3
89move 1 from 7 to 2
90move 4 from 7 to 8
91move 4 from 6 to 1
92move 1 from 5 to 1
93move 4 from 8 to 7
94move 2 from 3 to 2
95move 1 from 1 to 3
96move 15 from 4 to 2
97move 3 from 7 to 3
98move 4 from 7 to 2
99move 1 from 4 to 9
100move 5 from 3 to 8
101move 29 from 2 to 1
102move 1 from 9 to 5
103move 1 from 2 to 1
104move 11 from 1 to 5
105move 1 from 4 to 5
106move 2 from 6 to 3
107move 1 from 3 to 4
108move 16 from 1 to 9
109move 4 from 8 to 4
110move 3 from 6 to 9
111move 1 from 3 to 7
112move 1 from 7 to 3
113move 6 from 1 to 6
114move 3 from 4 to 3
115move 3 from 8 to 5
116move 3 from 1 to 8
117move 3 from 1 to 4
118move 2 from 4 to 9
119move 3 from 6 to 3
120move 15 from 5 to 2
121move 3 from 2 to 3
122move 4 from 2 to 7
123move 2 from 5 to 9
124move 10 from 3 to 6
125move 11 from 9 to 5
126move 2 from 4 to 9
127move 8 from 9 to 4
128move 1 from 9 to 6
129move 7 from 4 to 6
130move 3 from 5 to 8
131move 22 from 6 to 9
132move 4 from 7 to 8
133move 8 from 5 to 8
134move 2 from 4 to 3
135move 1 from 8 to 1
136move 17 from 8 to 3
137move 3 from 3 to 4
138move 13 from 3 to 9
139move 20 from 9 to 7
140move 2 from 2 to 9
141move 19 from 9 to 5
142move 1 from 1 to 4
143move 3 from 2 to 7
144move 4 from 4 to 3
145move 1 from 9 to 8
146move 18 from 5 to 1
147move 1 from 9 to 4
148move 1 from 9 to 7
149move 2 from 4 to 8
150move 1 from 5 to 4
151move 3 from 2 to 7
152move 3 from 3 to 1
153move 2 from 1 to 3
154move 3 from 3 to 8
155move 1 from 4 to 8
156move 6 from 8 to 2
157move 1 from 3 to 9
158move 1 from 3 to 9
159move 10 from 1 to 9
160move 7 from 1 to 7
161move 4 from 7 to 4
162move 29 from 7 to 3
163move 6 from 2 to 9
164move 25 from 3 to 6
165move 5 from 3 to 9
166move 13 from 6 to 9
167move 12 from 6 to 2
168move 1 from 8 to 9
169move 10 from 2 to 6
170move 7 from 6 to 5
171move 20 from 9 to 3
172move 11 from 3 to 6
173move 1 from 7 to 9
174move 2 from 2 to 9
175move 19 from 9 to 2
176move 14 from 6 to 8
177move 4 from 5 to 2
178move 2 from 4 to 6
179move 3 from 5 to 1
180move 13 from 8 to 5
181move 1 from 6 to 1
182move 2 from 4 to 2
183move 8 from 2 to 4
184move 6 from 4 to 7
185move 1 from 9 to 8
186move 2 from 4 to 7
187move 5 from 2 to 4
188move 4 from 4 to 2
189move 10 from 5 to 6
190move 1 from 1 to 7
191move 1 from 5 to 4
192move 1 from 4 to 9
193move 4 from 7 to 8
194move 5 from 1 to 7
195move 1 from 9 to 7
196move 7 from 3 to 2
197move 2 from 5 to 2
198move 8 from 6 to 9
199move 1 from 4 to 6
200move 3 from 7 to 4
201move 5 from 9 to 7
202move 2 from 4 to 3
203move 20 from 2 to 4
204move 2 from 4 to 8
205move 14 from 4 to 2
206move 12 from 7 to 4
207move 8 from 2 to 1
208move 10 from 2 to 4
209move 6 from 8 to 5
210move 1 from 7 to 8
211move 4 from 4 to 3
212move 1 from 3 to 9
213move 1 from 2 to 7
214move 1 from 6 to 8
215move 5 from 3 to 5
216move 1 from 3 to 2
217move 7 from 4 to 5
218move 6 from 1 to 7
219move 5 from 7 to 6
220move 1 from 6 to 5
221move 2 from 7 to 8
222move 1 from 2 to 6
223move 2 from 8 to 2
224move 5 from 5 to 7
225move 6 from 6 to 8
226move 16 from 4 to 9
227move 16 from 9 to 4
228move 11 from 5 to 4
229move 5 from 8 to 3
230move 2 from 5 to 2
231move 14 from 4 to 2
232move 1 from 6 to 3
233move 1 from 6 to 9
234move 1 from 5 to 3
235move 3 from 8 to 2
236move 10 from 4 to 7
237move 5 from 9 to 2
238move 3 from 4 to 7
239move 1 from 1 to 4
240move 3 from 2 to 5
241move 2 from 3 to 7
242move 1 from 4 to 2
243move 18 from 2 to 8
244move 3 from 8 to 4
245move 5 from 3 to 1
246move 1 from 3 to 9
247move 1 from 9 to 3
248move 8 from 8 to 7
249move 2 from 5 to 4
250move 1 from 5 to 6
251move 1 from 2 to 5
252move 1 from 5 to 8
253move 1 from 6 to 9
254move 3 from 2 to 7
255move 27 from 7 to 4
256move 2 from 2 to 4
257move 4 from 8 to 4
258move 1 from 9 to 8
259move 3 from 1 to 6
260move 1 from 3 to 5
261move 3 from 8 to 3
262move 1 from 1 to 4
263move 1 from 8 to 1
264move 3 from 1 to 4
265move 2 from 8 to 2
266move 2 from 6 to 2
267move 8 from 4 to 9
268move 1 from 7 to 1
269move 1 from 5 to 4
270move 1 from 7 to 3
271move 4 from 2 to 7
272move 1 from 8 to 6
273move 8 from 9 to 7
274move 1 from 6 to 3
275move 3 from 3 to 4
276move 37 from 4 to 1
277move 1 from 4 to 5
278move 13 from 7 to 8
279move 6 from 8 to 4
280move 5 from 8 to 3
281move 1 from 7 to 6
282move 4 from 1 to 5
283move 1 from 6 to 5
284move 2 from 8 to 4
285move 32 from 1 to 5
286move 1 from 1 to 4
287move 5 from 3 to 5
288move 1 from 3 to 2
289move 1 from 2 to 9
290move 19 from 5 to 2
291move 1 from 9 to 1
292move 16 from 5 to 1
293move 7 from 5 to 6
294move 1 from 3 to 1
295move 11 from 1 to 2
296move 18 from 2 to 4
297move 1 from 5 to 9
298move 8 from 6 to 1
299move 10 from 2 to 6
300move 7 from 4 to 9
301move 2 from 2 to 1
302move 7 from 4 to 2
303move 5 from 4 to 5
304move 2 from 9 to 6
305move 9 from 6 to 3
306move 5 from 5 to 3
307move 8 from 4 to 9
308move 7 from 9 to 8
309move 4 from 2 to 9
310move 10 from 3 to 1
311move 6 from 8 to 1
312move 2 from 6 to 3
313move 5 from 3 to 8
314move 3 from 2 to 7
315move 1 from 9 to 5
316move 1 from 3 to 5
317move 2 from 7 to 8
318move 1 from 8 to 9
319move 1 from 6 to 1
320move 23 from 1 to 4
321move 2 from 5 to 3
322move 1 from 8 to 2
323move 2 from 8 to 5
324move 2 from 5 to 6
325move 1 from 2 to 7
326move 1 from 7 to 5
327move 4 from 9 to 7
328move 1 from 7 to 5
329move 1 from 3 to 6
330move 3 from 7 to 4
331move 1 from 3 to 8
332move 1 from 4 to 6
333move 6 from 1 to 8
334move 4 from 6 to 4
335move 2 from 9 to 1
336move 1 from 5 to 1
337move 19 from 4 to 2
338move 2 from 9 to 3
339move 1 from 9 to 3
340move 9 from 1 to 8
341move 1 from 5 to 8
342move 1 from 9 to 3
343move 2 from 3 to 9
344move 3 from 8 to 4
345move 1 from 4 to 9
346move 1 from 9 to 5
347move 2 from 3 to 4
348move 6 from 4 to 7
349move 3 from 9 to 5
350move 4 from 4 to 7
351move 1 from 5 to 6
352move 18 from 2 to 7
353move 13 from 7 to 9
354move 3 from 5 to 1
355move 1 from 2 to 1
356move 1 from 6 to 5
357move 3 from 1 to 7
358move 1 from 1 to 5
359move 7 from 9 to 6
360move 8 from 7 to 4
361move 11 from 7 to 6
362move 5 from 9 to 2
363move 17 from 6 to 1
364move 2 from 5 to 1
365move 11 from 8 to 1
366move 20 from 1 to 2
367move 3 from 8 to 1
368move 1 from 9 to 8
369move 1 from 6 to 1
370move 11 from 1 to 7
371move 18 from 2 to 3
372move 12 from 4 to 8
373move 11 from 7 to 3
374move 7 from 2 to 3
375move 2 from 1 to 5
376move 1 from 1 to 3
377move 1 from 8 to 1
378move 1 from 5 to 9
379move 1 from 9 to 6
380move 1 from 8 to 7
381move 1 from 5 to 3
382move 1 from 6 to 7
383move 2 from 8 to 1
384move 8 from 3 to 2
385move 7 from 2 to 9
386move 6 from 8 to 6
387move 1 from 9 to 3
388move 2 from 6 to 4
389move 5 from 9 to 6
390move 7 from 6 to 2
391move 8 from 2 to 9
392move 2 from 1 to 9
393move 2 from 7 to 2
394move 2 from 4 to 8
395move 1 from 2 to 7
396move 25 from 3 to 7
397move 7 from 9 to 7
398move 1 from 2 to 5
399move 1 from 1 to 4
400move 3 from 8 to 1
401move 3 from 1 to 8
402move 3 from 7 to 8
403move 15 from 7 to 3
404move 10 from 8 to 3
405move 1 from 5 to 7
406move 1 from 8 to 5
407move 3 from 9 to 2
408move 1 from 6 to 4
409move 2 from 2 to 7
410move 1 from 2 to 5
411move 14 from 7 to 9
412move 1 from 6 to 2
413move 1 from 7 to 1
414move 1 from 5 to 4
415move 3 from 4 to 3
416move 1 from 7 to 6
417move 1 from 2 to 7
418move 1 from 1 to 2
419move 3 from 9 to 1
420move 1 from 6 to 2
421move 2 from 2 to 6
422move 17 from 3 to 6
423move 1 from 8 to 3
424move 1 from 5 to 4
425move 2 from 7 to 2
426move 9 from 9 to 8
427move 1 from 9 to 3
428move 16 from 3 to 2
429move 1 from 7 to 5
430move 5 from 6 to 5
431move 1 from 1 to 6
432move 1 from 4 to 1
433move 1 from 9 to 3
434move 9 from 8 to 6
435move 3 from 1 to 5
436move 1 from 9 to 1
437move 16 from 2 to 1
438move 2 from 2 to 7
439move 2 from 3 to 9
440move 2 from 7 to 4
441move 2 from 9 to 3
442move 3 from 3 to 5
443move 1 from 4 to 5
444move 1 from 4 to 2
445move 1 from 1 to 7
446move 1 from 7 to 1
447move 1 from 3 to 6
448move 2 from 5 to 1
449move 3 from 6 to 2
450move 2 from 5 to 8
451move 8 from 5 to 4
452move 1 from 5 to 3
453move 1 from 3 to 2
454move 1 from 8 to 3
455move 1 from 3 to 8
456move 4 from 1 to 7
457move 9 from 1 to 7
458move 6 from 1 to 8
459move 3 from 7 to 4
460move 7 from 6 to 7
461move 11 from 4 to 3
462move 2 from 3 to 8
463move 8 from 3 to 8
464move 4 from 6 to 1
465move 1 from 7 to 4
466move 2 from 1 to 2
467move 8 from 7 to 2
468move 1 from 4 to 8
469move 10 from 8 to 2
470move 2 from 6 to 1
471move 1 from 1 to 4
472move 1 from 4 to 8
473move 2 from 1 to 4
474move 6 from 6 to 5
475move 1 from 1 to 9
476move 2 from 6 to 8
477move 1 from 4 to 5
478move 1 from 6 to 9
479move 4 from 8 to 9
480move 1 from 7 to 1
481move 6 from 8 to 6
482move 1 from 6 to 1
483move 1 from 4 to 9
484move 2 from 9 to 5
485move 5 from 5 to 9
486move 8 from 9 to 5
487move 2 from 8 to 5
488move 3 from 6 to 9
489move 8 from 5 to 7
490move 5 from 5 to 6
491move 1 from 9 to 2
492move 1 from 3 to 1
493move 1 from 6 to 7
494move 1 from 5 to 6
495move 24 from 2 to 4
496move 3 from 9 to 7
497move 16 from 4 to 5
498move 2 from 1 to 3
499move 12 from 5 to 6
500move 1 from 9 to 5
501move 4 from 5 to 9
502move 1 from 1 to 6
503move 1 from 5 to 2
504move 2 from 9 to 8
505move 1 from 8 to 1
506move 5 from 4 to 5
507move 2 from 3 to 5
508move 1 from 8 to 3
509move 1 from 1 to 6
510move 3 from 5 to 7
511move 1 from 9 to 1
512move 1 from 2 to 8
diff --git a/day5/solution.nim b/day5/solution.nim
new file mode 100644
index 0000000..2bf41aa
--- /dev/null
+++ b/day5/solution.nim
@@ -0,0 +1,87 @@
1import std/strutils
2import std/sequtils
3import std/enumerate
4import std/algorithm
5import std/re
6
7type
8 Move = tuple
9 Amount: int
10 From: int
11 To: int
12
13 Stack = seq[char]
14
15 Input = tuple
16 Stacks: seq[Stack]
17 Moves: seq[Move]
18
19proc parseContent(content: string): Input =
20 # Parse stacks
21 let tokens = content.split("\n\n")
22 var strStacks = map(
23 # All lines containing characters of the stacks
24 # Exclude last line since it contain's each stack's id
25 tokens[0].splitLines()[0 .. ^2],
26 proc(line: string): string =
27 var retval = ""
28 # keep only the relevant characters (spaces/letters)
29 for i in countup(1, line.len(), 4):
30 retval.add(line[i])
31 retval
32 )
33
34 var Stacks = newSeq[Stack](10)
35
36 for layer in strStacks:
37 for i, c in enumerate(layer):
38 if c != ' ':
39 Stacks[i+1].add(c)
40
41 var strMoves = map(
42 # All moves described in the input
43 tokens[1].strip().splitLines(),
44 proc(line: string): seq[int] =
45 # Remove words and split on spaces
46 let tokens = line.replace(re"[a-z]+ ").split(" ")
47 # Parse them as integers
48 map(tokens, proc (num: string): int = num.parseInt())
49 )
50
51 var Moves: seq[Move]
52 for move in strMoves:
53 Moves.add((move[0], move[1], move[2]))
54
55 return (Stacks, Moves)
56
57proc makeMove(stacks: var seq[Stack], move: Move, inPlace = false): void =
58 # copy top of the stack
59 var yoink = stacks[move.From][0 ..< move.Amount]
60 # moving in place preserves the order of the moved crates (part2)
61 if not inPlace:
62 yoink.reverse()
63 # remove it from origin
64 stacks[move.From].delete(0 ..< move.Amount)
65 # concat it in front of destination
66 stacks[move.To] = concat(yoink, stacks[move.To])
67
68proc getAnswer(stacks: seq[Stack]): string =
69 var answer = ""
70 for stack in stacks:
71 if stack.len() > 0:
72 answer.add(stack[0])
73 answer
74
75let content = readFile("./input.txt")
76var input = parseContent(content)
77
78let moves = input.Moves
79var stacksPart1 = input.Stacks
80var stacksPart2 = input.Stacks
81
82for move in moves:
83 makeMove(stacksPart1, move)
84 makeMove(stacksPart2, move, true)
85
86echo getAnswer(stacksPart1)
87echo getAnswer(stacksPart2)