Add 2020 day 8

This commit is contained in:
Xavier Morel
2020-12-08 10:54:42 +01:00
parent 062789f430
commit ec8d712129
3 changed files with 688 additions and 0 deletions

637
haskellAoC/inputs/2020/08 Normal file
View File

@@ -0,0 +1,637 @@
jmp +248
acc +11
acc +50
acc +44
jmp +531
acc -17
jmp +572
acc +19
acc +9
jmp +221
nop +373
acc +7
jmp +502
acc +39
jmp +12
acc +7
nop +482
jmp +144
acc -4
jmp +85
acc +12
nop +446
nop +162
jmp +270
acc -19
jmp +402
acc +8
acc +28
acc -13
acc +30
jmp +81
acc -15
jmp +20
acc +28
jmp -19
nop +190
acc +2
jmp +61
nop +237
jmp +421
acc +24
jmp +221
acc +1
jmp +1
jmp +265
nop +94
jmp +1
jmp +370
acc +19
nop +39
jmp +454
jmp +162
jmp +196
jmp +7
acc +37
acc +14
jmp +542
acc -10
acc +1
jmp +324
nop -45
acc -5
jmp +303
acc +25
acc +17
nop +74
nop +330
jmp -7
acc +45
jmp +483
acc -4
jmp +230
jmp +61
jmp +1
nop +440
jmp +104
acc +33
jmp +140
acc -8
jmp +19
acc -10
acc +0
acc +8
acc +30
jmp +37
jmp +457
jmp +108
jmp +182
acc +23
acc +38
acc -1
acc +8
jmp +330
acc +2
acc -2
nop +483
acc +31
jmp +426
acc +25
acc +1
jmp +296
acc +10
acc +32
jmp +223
acc +3
nop +350
acc +29
acc +4
jmp +427
acc +42
jmp +312
acc +7
acc -6
nop +366
nop +409
jmp +364
jmp -78
acc +42
jmp +159
acc +33
jmp +128
nop +86
acc +5
jmp +1
acc +47
jmp +150
acc -8
jmp -101
acc +31
nop +55
acc +2
jmp +39
jmp +12
acc +5
jmp +1
jmp -115
nop +141
nop +418
jmp +75
nop +430
acc -19
acc -12
jmp +83
jmp +82
acc +27
jmp -65
acc -5
jmp +422
acc +16
acc +20
jmp +336
acc +29
jmp -110
acc +1
acc +13
acc +37
jmp +38
acc +45
acc +2
acc +45
jmp -12
acc +36
acc +26
acc +50
jmp +343
acc -17
acc -18
acc +34
acc +23
jmp +274
acc +20
acc +12
nop +129
acc -1
jmp +5
acc +39
acc +40
acc +28
jmp +272
jmp +147
acc +50
jmp +1
acc +17
jmp -131
acc +8
acc -17
acc -16
acc +7
jmp +25
acc +47
acc +14
acc +27
acc -2
jmp +224
acc -6
acc -10
acc +23
jmp -109
acc -1
jmp -145
acc +40
nop +275
jmp +420
nop -92
nop -43
jmp +1
jmp -134
nop +297
acc +14
jmp +60
nop +412
nop +14
jmp -79
jmp +1
acc +25
jmp +176
jmp -206
acc +50
acc +17
jmp +271
acc +9
nop -82
acc +6
acc +19
jmp +184
acc +34
acc +32
acc -6
jmp -21
jmp -4
nop -154
acc +38
jmp +10
acc +25
acc +46
acc +32
jmp +65
acc -3
acc +44
jmp -153
acc +31
jmp +21
acc +31
acc +40
jmp +137
nop +307
acc -10
jmp -193
acc +5
acc +0
acc +42
acc -7
jmp -104
jmp +233
acc +41
acc +42
acc +43
jmp +358
acc +13
nop +140
acc +20
jmp +337
acc +18
acc -7
acc -14
jmp -213
nop +142
acc +13
jmp +115
acc +48
acc +30
acc +15
jmp +283
acc -14
jmp -153
jmp -75
jmp -178
acc +36
acc +9
jmp +32
acc +28
jmp -229
jmp +93
acc +41
jmp +91
acc -17
acc +3
jmp +163
nop +129
acc +0
nop -169
acc -11
jmp -23
acc +8
acc -8
jmp +106
acc +8
acc +43
acc -3
acc +25
jmp -15
nop -296
acc -4
jmp +220
nop -244
acc +38
acc -3
nop -163
jmp -169
jmp -304
jmp +169
acc +22
acc -5
acc +21
acc +7
jmp -162
acc +17
jmp -229
nop +35
acc +42
acc +12
acc +12
jmp +95
acc -7
nop +136
jmp +130
acc +0
acc +0
acc +16
acc +50
jmp -297
nop +183
nop +104
acc +18
jmp -65
acc -4
jmp +1
jmp +227
nop -76
jmp -109
acc +27
acc -2
acc -9
jmp +16
nop +99
acc +46
acc -7
nop +2
jmp +258
acc -10
jmp +122
acc -19
jmp +23
nop -205
acc -16
jmp +81
nop +235
acc -16
jmp +69
acc -11
acc +4
jmp +1
jmp -80
acc -19
jmp +108
acc +31
acc -7
nop -137
acc +26
jmp -185
acc -3
acc +44
acc -2
acc +43
jmp -137
acc +14
nop +96
jmp -28
acc +5
acc +19
jmp -31
jmp +18
jmp -356
acc +34
acc +45
jmp +170
acc +39
acc +3
acc +22
acc +23
jmp -370
jmp -73
acc +23
acc +46
acc +8
jmp -297
acc +46
jmp -387
jmp -312
jmp -345
jmp +229
acc -6
jmp +74
nop -209
acc +43
nop -151
acc +41
jmp -182
acc -12
acc -5
acc -13
acc +3
jmp -386
acc +45
acc +9
nop -97
jmp -411
acc +0
jmp +151
nop +150
acc +17
jmp -144
acc +3
acc +12
nop +55
jmp -377
jmp -421
nop +52
acc -18
acc -9
jmp -77
acc -14
acc +33
nop -316
acc +44
jmp -193
nop +150
acc -16
jmp -294
acc +26
acc -14
acc -7
jmp -61
nop -84
acc +0
jmp -105
acc +48
jmp +1
acc -6
jmp -109
acc -12
acc +37
acc +24
jmp +73
jmp -275
acc +14
acc -19
jmp -156
nop -147
jmp -94
acc -4
acc +50
acc +26
acc -1
jmp -392
nop +58
jmp -440
acc -1
jmp -85
acc +39
acc +8
jmp -318
nop -123
jmp +133
acc -18
jmp +131
acc +50
jmp -401
jmp -458
acc -9
acc +23
jmp +26
acc +15
acc -5
nop -236
jmp -89
acc -3
acc +28
jmp +98
jmp -413
acc -19
acc +41
acc +21
jmp -365
nop +97
acc +18
acc +44
jmp -186
acc -3
acc +31
nop -356
acc +26
jmp -217
jmp -13
acc +42
jmp -437
jmp -322
jmp +1
jmp -81
acc +28
acc +0
acc +45
acc +36
jmp -441
acc +50
acc +23
acc +1
acc +45
jmp -11
acc +16
acc -13
acc +16
jmp +13
jmp -419
jmp +1
jmp +66
acc +40
acc -5
acc -8
acc +39
jmp +61
acc +8
acc +25
acc +41
jmp -395
acc +5
acc +28
jmp -70
jmp +1
acc +15
acc -11
jmp -437
acc +17
acc +30
acc -15
acc +22
jmp -91
acc +44
acc +47
acc +0
acc +39
jmp -258
jmp -514
acc +46
jmp -478
acc +38
acc +12
acc +44
jmp -167
acc +41
jmp +1
acc +30
nop -337
jmp -521
acc -11
nop -426
jmp -68
acc -11
jmp -331
acc +44
acc +6
acc +13
jmp +1
jmp -519
acc +48
acc +13
acc +34
jmp -51
acc +19
acc +46
acc +26
acc +35
jmp -345
acc +20
jmp +1
jmp -220
acc +18
acc +43
nop -65
jmp -335
jmp -305
acc +19
acc -1
jmp -551
acc +40
acc +11
acc -13
jmp -196
acc +18
nop -460
acc +28
jmp -266
acc +41
nop -450
acc +20
jmp -380
acc +24
acc +44
acc +2
acc +0
jmp +22
acc -10
acc +0
acc -8
jmp -255
nop -80
acc +24
jmp -513
acc +23
nop -238
acc +31
jmp -504
nop -461
acc +40
acc +39
jmp +4
acc +2
acc +18
jmp -359
jmp -143
acc -5
jmp -117
acc -12
acc +40
jmp +1
acc +15
jmp +1

View File

@@ -0,0 +1,49 @@
module Y2020.Day08 (y20day08) where
import Data.List
import Data.List.Split
import qualified Data.Map as M
data Instr = Acc Int | Jmp Int | Nop Int deriving (Show)
-- current offset, current acc, visited offsets
type State = (Int, Int, [Int])
runInstructions :: M.Map Int Instr -> State -> (Bool, Int)
runInstructions instr (cur, acc, visited)
| cur `elem` visited = (False, acc) -- looping
| cur `M.notMember` instr = (True, acc) -- terminated
| otherwise = runInstructions instr (newCur, newAcc, newVisited)
where newVisited = cur:visited
(newCur, newAcc) = case (instr M.! cur) of
Nop _ -> (cur + 1, acc)
Acc qty -> (cur + 1, acc + qty)
Jmp ofs -> (cur + ofs, acc)
parseInput :: String -> Instr
parseInput input
| "nop" `isPrefixOf` input = Nop nb
| "acc" `isPrefixOf` input = Acc nb
| "jmp" `isPrefixOf` input = Jmp nb
where nb = (sign raw_sign) 0 number :: Int
(raw_sign:raw_number) = (splitOn " " input) !! 1
sign '+' = (+)
sign '-' = (-)
number = read raw_number :: Int
testSwappedNopJmp :: M.Map Int Instr -> Int -> Int
testSwappedNopJmp original offset = case original M.! offset of
Acc _ -> next
Jmp qty -> resWithSwap (Nop qty)
Nop qty -> resWithSwap (Jmp qty)
where next = testSwappedNopJmp original (offset + 1)
resWithSwap swapped = case (runInstructions (swappedInput swapped) (0, 0, [])) of
(True, acc) -> acc
(False, _) -> next
swappedInput new = M.insert offset new original
y20day08 :: [String] -> (String, String)
y20day08 input = (part1, part2)
where part1 = show $ snd $ runInstructions ops (0, 0, [])
part2 = show $ testSwappedNopJmp ops 0
ops = M.fromList $ zip (iterate (+ 1) 0) $ map parseInput input

View File

@@ -7,6 +7,7 @@ import Y2020.Day04
import Y2020.Day05 import Y2020.Day05
import Y2020.Day06 import Y2020.Day06
import Y2020.Day07 import Y2020.Day07
import Y2020.Day08
year2020 :: String -> [String] -> (String, String) year2020 :: String -> [String] -> (String, String)
year2020 "01" = y20day01 year2020 "01" = y20day01
@@ -16,3 +17,4 @@ year2020 "04" = y20day04
year2020 "05" = y20day05 year2020 "05" = y20day05
year2020 "06" = y20day06 year2020 "06" = y20day06
year2020 "07" = y20day07 year2020 "07" = y20day07
year2020 "08" = y20day08