diff --git a/haskellAoC/inputs/2020/08 b/haskellAoC/inputs/2020/08 new file mode 100644 index 0000000..15231f5 --- /dev/null +++ b/haskellAoC/inputs/2020/08 @@ -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 diff --git a/haskellAoC/src/Y2020/Day08.hs b/haskellAoC/src/Y2020/Day08.hs new file mode 100644 index 0000000..3620219 --- /dev/null +++ b/haskellAoC/src/Y2020/Day08.hs @@ -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 diff --git a/haskellAoC/src/Y2020/Days.hs b/haskellAoC/src/Y2020/Days.hs index 7eba71e..e2c9c7a 100644 --- a/haskellAoC/src/Y2020/Days.hs +++ b/haskellAoC/src/Y2020/Days.hs @@ -7,6 +7,7 @@ import Y2020.Day04 import Y2020.Day05 import Y2020.Day06 import Y2020.Day07 +import Y2020.Day08 year2020 :: String -> [String] -> (String, String) year2020 "01" = y20day01 @@ -16,3 +17,4 @@ year2020 "04" = y20day04 year2020 "05" = y20day05 year2020 "06" = y20day06 year2020 "07" = y20day07 +year2020 "08" = y20day08