aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-12-08 07:03:22 +0000
committerAkshay <[email protected]>2020-12-08 07:03:22 +0000
commit06b14ed84c0a8ec11462f0a6f7397c3e3a52654d (patch)
tree5d28d13ede49b48f63b42fd31816f0e98a68aca6
parent90ee9892e2e0fd188bac09c50987c967cf282333 (diff)
add initial day08 solution
-rw-r--r--aoc.cabal6
-rw-r--r--execs/Day08.hs45
-rw-r--r--input/08626
3 files changed, 677 insertions, 0 deletions
diff --git a/aoc.cabal b/aoc.cabal
index 11bd93d..01cebc9 100644
--- a/aoc.cabal
+++ b/aoc.cabal
@@ -63,3 +63,9 @@ executable Day07
63 build-depends: base, aoc, containers, parsec 63 build-depends: base, aoc, containers, parsec
64 default-language: Haskell2010 64 default-language: Haskell2010
65 hs-source-dirs: execs 65 hs-source-dirs: execs
66
67executable Day08
68 main-is: Day08.hs
69 build-depends: base, aoc, containers
70 default-language: Haskell2010
71 hs-source-dirs: execs
diff --git a/execs/Day08.hs b/execs/Day08.hs
new file mode 100644
index 0000000..7d3fce8
--- /dev/null
+++ b/execs/Day08.hs
@@ -0,0 +1,45 @@
1module Main where
2
3import Data.Set (Set)
4import qualified Data.Set as Set
5import Data.Map (Map)
6import qualified Data.Map as Map
7import Utils
8
9type Op = (String, Int)
10
11parseLine :: [String] -> Op
12parseLine [s, j] = (s, read (dropWhile (== '+') j))
13
14run :: Int -> Int -> Set Int -> Map Int Op -> Int
15run acc pc visited operations = if Set.member pc visited then acc else handleCase
16 where visited' = Set.insert pc visited
17 handleCase =
18 case Map.lookup pc operations of
19 Just ("acc", v) -> run (acc + v) (pc + 1) visited' operations
20 Just ("nop", _) -> run acc (pc + 1) visited' operations
21 Just ("jmp", j) -> run acc (pc + j) visited' operations
22 _ -> acc
23
24doesEnd :: Int -> Int -> Set Int -> Map Int Op -> Bool
25doesEnd acc pc visited operations = not (Set.member pc visited) && handleCase
26 where visited' = Set.insert pc visited
27 handleCase =
28 case Map.lookup pc operations of
29 Just ("acc", v) -> doesEnd (acc + v) (pc + 1) visited' operations
30 Just ("nop", _) -> doesEnd acc (pc + 1) visited' operations
31 Just ("jmp", j) -> doesEnd acc (pc + j) visited' operations
32 _ -> True -- pc has crossed the end!
33
34genAll :: [Op] -> [[Op]]
35genAll [] = []
36genAll (n@("nop",v):rest) = (("jmp",v):rest) : map (n:) (genAll rest)
37genAll (j@("jmp",v):rest) = (("nop",v):rest) : map (j:) (genAll rest)
38genAll (acc:rest) = map (acc:) $ genAll rest
39
40main :: IO ()
41main = do
42 n <- map (parseLine . words) . lines <$> readFile "input/08"
43 let solve1 = run 0 0 Set.empty . Map.fromList . zip [0..]
44 print $ solve1 n
45 print $ solve1 $ head $ filter (doesEnd 0 0 Set.empty . Map.fromList . zip [0..]) $ genAll n
diff --git a/input/08 b/input/08
new file mode 100644
index 0000000..4d50e16
--- /dev/null
+++ b/input/08
@@ -0,0 +1,626 @@
1nop +346
2acc +44
3acc +15
4jmp +473
5acc +29
6acc -13
7jmp +525
8acc +22
9acc +13
10nop +265
11jmp +397
12jmp +39
13acc +39
14nop -1
15acc +36
16acc +25
17jmp +153
18nop +374
19jmp +27
20jmp +282
21jmp +1
22jmp +1
23jmp +15
24acc +33
25acc -3
26jmp +533
27acc +25
28acc -14
29acc -16
30jmp +245
31nop +567
32acc +7
33jmp +147
34acc +26
35acc +40
36acc -9
37jmp +295
38acc +14
39nop +388
40acc -1
41jmp -21
42nop +524
43nop +166
44nop +515
45jmp +18
46jmp +214
47acc +42
48nop -35
49acc +7
50jmp +492
51acc +14
52acc +48
53jmp +326
54acc +48
55acc -18
56acc -5
57jmp +343
58jmp +81
59acc +18
60acc +16
61acc +21
62jmp +355
63acc +48
64nop +358
65acc +49
66acc -2
67jmp +89
68acc +4
69jmp +171
70acc +6
71jmp +299
72acc -8
73jmp +150
74acc +41
75acc -9
76acc +48
77jmp +73
78jmp +523
79nop +471
80jmp +493
81acc -16
82nop +440
83acc +2
84acc +33
85jmp +117
86acc +3
87acc +34
88jmp +310
89acc +8
90jmp +197
91acc +26
92acc +47
93jmp +194
94nop +115
95jmp +259
96nop +456
97jmp +420
98nop +398
99jmp +235
100acc +44
101acc +47
102jmp +218
103jmp +1
104jmp +275
105acc +12
106jmp +434
107acc +50
108acc +10
109nop +361
110jmp +367
111acc -16
112acc +44
113jmp +96
114acc +9
115acc +38
116acc -15
117nop -31
118jmp -55
119nop +421
120acc +50
121acc +12
122jmp -64
123acc +33
124acc +25
125jmp +382
126acc +7
127jmp -22
128jmp +95
129acc +44
130acc +32
131acc +23
132jmp +1
133jmp +456
134acc +49
135jmp +15
136jmp +312
137acc +6
138jmp +216
139acc +7
140jmp +458
141jmp +465
142nop +372
143acc +35
144acc +32
145acc +13
146jmp -35
147acc +50
148nop +32
149jmp +143
150jmp +327
151acc +0
152nop -82
153nop -62
154acc +41
155jmp -81
156acc -10
157nop -106
158jmp +82
159acc +1
160acc +11
161jmp +124
162acc +25
163acc +17
164jmp -73
165nop +8
166acc +29
167acc +33
168acc +10
169jmp +123
170jmp +236
171acc +41
172jmp +370
173acc +17
174acc -13
175acc +35
176jmp -47
177nop +287
178acc +22
179jmp +38
180jmp +1
181nop -52
182nop -9
183acc +22
184jmp +253
185acc +12
186acc -18
187acc +21
188nop -69
189jmp +28
190acc +16
191jmp +392
192jmp +325
193jmp -74
194acc +34
195acc +47
196acc +41
197jmp +201
198nop +361
199acc +50
200jmp +30
201jmp -127
202nop -171
203jmp +349
204acc +11
205nop +156
206acc +1
207acc -18
208jmp +393
209acc -8
210jmp +1
211acc -17
212nop +188
213jmp +134
214acc -9
215acc -14
216jmp +206
217jmp -209
218jmp +1
219acc +49
220nop +112
221acc -4
222jmp -20
223acc +41
224jmp -145
225acc +8
226jmp +276
227acc +48
228jmp -5
229jmp -143
230acc +0
231jmp -161
232jmp +238
233acc +8
234jmp -134
235acc +34
236acc +10
237jmp +1
238nop +109
239jmp -100
240acc +41
241acc -4
242jmp -12
243acc +42
244acc +46
245acc -7
246acc +28
247jmp +85
248jmp +216
249jmp +364
250acc +0
251acc -6
252nop +331
253acc +33
254jmp +163
255acc +37
256acc +20
257acc +33
258acc +45
259jmp -159
260acc +34
261acc +10
262acc +48
263acc +10
264jmp +358
265acc -9
266jmp +276
267acc +27
268acc +45
269nop +129
270acc +32
271jmp +243
272acc +0
273acc -5
274jmp -24
275acc +44
276nop +307
277acc -18
278acc +13
279jmp +37
280acc +5
281nop -125
282nop -126
283acc -18
284jmp +186
285jmp -87
286jmp -262
287nop -20
288jmp -108
289acc +26
290acc +20
291jmp +193
292nop +185
293jmp +129
294acc +26
295jmp +122
296acc -8
297nop +143
298nop +166
299jmp -236
300acc +33
301jmp -139
302acc +38
303jmp +1
304acc +21
305acc +31
306jmp -79
307acc -13
308jmp -78
309acc +29
310jmp +160
311acc +48
312acc -8
313acc +28
314acc +15
315jmp -284
316jmp +25
317acc +24
318jmp +1
319jmp -92
320acc +22
321jmp +169
322acc -15
323acc +16
324acc +4
325jmp -85
326acc -18
327acc -19
328acc -2
329jmp -278
330acc +48
331jmp -195
332jmp -40
333jmp -110
334acc +47
335jmp -26
336acc +26
337nop -187
338acc +40
339acc +42
340jmp +167
341acc +50
342acc +36
343acc -14
344jmp -313
345nop -203
346jmp +227
347acc -15
348acc +22
349jmp -23
350acc +6
351acc +30
352acc +12
353jmp +69
354nop -212
355nop -105
356acc +12
357jmp -155
358nop +69
359acc -16
360jmp -68
361acc -18
362acc +35
363acc +34
364acc +6
365jmp -80
366acc +7
367acc +19
368acc -8
369jmp -94
370acc +12
371nop -148
372acc +33
373nop -41
374jmp -107
375acc +25
376acc +9
377nop +107
378jmp -44
379jmp +1
380jmp -254
381acc +10
382acc +0
383acc +37
384acc +33
385jmp +137
386nop +136
387jmp -225
388acc -4
389acc -17
390acc +39
391jmp -286
392jmp +150
393nop -380
394acc +34
395acc +16
396nop +146
397jmp +105
398jmp +119
399jmp -190
400acc +0
401nop +205
402nop -302
403jmp -17
404acc -4
405jmp -7
406jmp -14
407jmp -394
408acc +34
409acc -1
410acc +37
411acc -17
412jmp -312
413nop -180
414nop -139
415acc +21
416jmp -378
417acc +24
418acc +38
419jmp +129
420acc +26
421jmp +19
422acc +31
423jmp -190
424acc +29
425acc -5
426jmp +14
427nop +186
428acc +12
429acc +9
430acc -16
431jmp +9
432acc +2
433nop -382
434nop -284
435nop -377
436jmp -169
437jmp +129
438acc +49
439jmp -297
440acc +48
441acc +18
442acc +8
443jmp +170
444acc +12
445acc -4
446acc +28
447jmp -20
448acc -11
449jmp -363
450jmp +1
451acc +9
452acc +31
453jmp +31
454acc +36
455acc +42
456acc +2
457nop -131
458jmp -322
459acc +35
460acc +44
461acc +11
462acc +14
463jmp -213
464acc -16
465acc -15
466acc -5
467jmp -277
468acc -17
469jmp -252
470acc -19
471acc +31
472acc -16
473acc -5
474jmp +48
475jmp +1
476jmp -97
477acc +5
478jmp -382
479acc +26
480acc +41
481acc +31
482acc -2
483jmp -392
484acc +41
485jmp -124
486acc +45
487acc +24
488acc +10
489jmp -339
490acc +29
491acc -10
492acc -10
493acc +3
494jmp -456
495jmp -25
496acc +37
497acc +39
498acc -11
499acc -1
500jmp +106
501jmp -328
502jmp -489
503nop -111
504nop -458
505acc +31
506jmp -100
507acc -18
508jmp -258
509acc -17
510nop -46
511acc +43
512acc +45
513jmp -127
514jmp +34
515acc +33
516jmp -200
517nop -90
518acc +20
519jmp -271
520acc +41
521jmp -189
522acc -16
523nop -321
524acc +25
525acc -12
526jmp -62
527acc -1
528jmp +1
529acc +35
530acc +39
531jmp -184
532jmp -236
533nop -331
534acc +12
535jmp +78
536acc +15
537jmp -30
538acc -11
539jmp -117
540jmp -8
541jmp +9
542acc +2
543jmp -497
544acc +10
545acc +0
546acc -6
547jmp -155
548jmp -148
549jmp -95
550jmp -96
551jmp -249
552nop -277
553nop -411
554acc -13
555acc -2
556jmp -383
557acc -13
558jmp -110
559acc +13
560acc +16
561acc +5
562acc -2
563jmp -67
564acc +37
565jmp -491
566acc +35
567acc +34
568acc +32
569acc -2
570jmp -546
571acc -19
572jmp -322
573acc +48
574acc +18
575acc +35
576acc +8
577jmp -448
578acc +41
579acc -15
580acc +34
581acc +46
582jmp -50
583acc +12
584nop -184
585acc +14
586acc +38
587jmp -370
588jmp +10
589acc -14
590acc -16
591nop -259
592nop -300
593jmp -400
594acc +38
595acc +29
596acc +27
597jmp -175
598jmp -456
599acc +30
600jmp -308
601jmp -538
602jmp +1
603acc -16
604nop -127
605jmp -407
606acc +5
607jmp -57
608acc +21
609acc +3
610acc +42
611acc +43
612jmp -521
613acc -9
614acc +20
615nop -217
616jmp -15
617acc +37
618acc -12
619acc -18
620jmp +1
621jmp -465
622acc +37
623nop -577
624acc +8
625acc +43
626jmp +1