Last active
December 8, 2020 18:21
-
-
Save mjgpy3/4c30753f3f666d37ee5eeb73bd15b477 to your computer and use it in GitHub Desktop.
aoc-2020-day8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Main where | |
import qualified Data.Map.Strict as M | |
import qualified Data.Set as S | |
data Inst | |
= Nop Int | |
| Acc Int | |
| Jmp Int | |
nop = Nop | |
acc = Acc | |
jmp = Jmp | |
program = | |
M.fromList $ zip [0..] [ | |
jmp (336), | |
jmp (593), | |
jmp (121), | |
acc (-8), | |
nop (459), | |
-- etc... thanks vim | |
] | |
stopBeforeFirstRepeat prog = go S.empty 0 0 | |
where | |
go seen ip acc | S.member ip seen = (ip, acc) | |
go seen ip acc = | |
let | |
seen' = S.insert ip seen | |
in | |
case prog M.! ip of | |
Nop _ -> go seen' (ip + 1) acc | |
Acc v -> go seen' (ip + 1) (acc + v) | |
Jmp offset -> go seen (ip + offset) acc | |
main = | |
print $ stopBeforeFirstRepeat program |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Main where | |
import qualified Data.Map.Strict as M | |
import qualified Data.Set as S | |
import Control.Monad (guard) | |
import Data.Maybe (catMaybes) | |
data Inst | |
= Nop Int | |
| Acc Int | |
| Jmp Int | |
isFlippable (Acc _) = False | |
isFlippable _ = True | |
flipInst (Nop v) = Jmp v | |
flipInst (Jmp v) = Nop v | |
flipInst v = v | |
nop = Nop | |
acc = Acc | |
jmp = Jmp | |
program = | |
M.fromList $ zip [0..] [ | |
jmp (336), | |
jmp (593), | |
jmp (121), | |
acc (-8), | |
nop (459), | |
-- etc... thanks vim | |
] | |
possiblePrograms prog = do | |
ip <- [0..M.size prog-1] | |
guard $ isFlippable (prog M.! ip) | |
pure $ M.adjust flipInst ip prog | |
finalAcc prog = go S.empty 0 0 | |
where | |
go seen ip acc | S.member ip seen = Nothing | |
go seen ip acc = | |
let | |
seen' = S.insert ip seen | |
in | |
case M.lookup ip prog of | |
Just (Nop _) -> go seen' (ip + 1) acc | |
Just (Acc v) -> go seen' (ip + 1) (acc + v) | |
Just (Jmp offset) -> go seen' (ip + offset) acc | |
Nothing -> Just acc | |
main = | |
print $ head $ catMaybes $ map finalAcc $ possiblePrograms program |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment