diff options
Diffstat (limited to '2020/8.hs')
-rw-r--r-- | 2020/8.hs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/2020/8.hs b/2020/8.hs new file mode 100644 index 0000000..bc90351 --- /dev/null +++ b/2020/8.hs @@ -0,0 +1,35 @@ +module Main where + +import Data.Maybe (catMaybes) +import qualified Data.Set as Set + +import Asm +import Input + + +main :: IO () +main = do + input <- getInput 8 + let prog = programFrom (map parseIns input) + + let nodupPredicate set state + | sIP state `Set.member` set = (set, True) + | sIP state == programLength prog = (set, True) + | otherwise = (Set.insert (sIP state) set, False) + + print (sAcc (evalUntil nodupPredicate prog mempty initState)) + + let overriders = catMaybes + [case programGet prog i of + NOP a -> Just $ \j -> if j == i then Just (JMP a) else Nothing + JMP a -> Just $ \j -> if j == i then Just (NOP a) else Nothing + _ -> Nothing + | i <- [0 .. programLength prog - 1]] + + results = + [state + | ovr <- overriders + , let state = evalUntil nodupPredicate (prog `withOverrider` ovr) mempty initState + , sIP state == programLength prog] + + print (sAcc (head results)) |