Skip to content

Instantly share code, notes, and snippets.

@mjgpy3
Last active December 8, 2020 18:21
Show Gist options
  • Save mjgpy3/4c30753f3f666d37ee5eeb73bd15b477 to your computer and use it in GitHub Desktop.
Save mjgpy3/4c30753f3f666d37ee5eeb73bd15b477 to your computer and use it in GitHub Desktop.
aoc-2020-day8
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
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