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))