SDOSY3PBOG3OYCPQ4AVQPU7OIPZ5P6NKFAFOLW7CTQCDSCI6GMSQC acc +42acc -12nop +112acc +47jmp +600acc +21jmp +1acc +0acc +50jmp +16acc +10jmp +56acc -5nop +179nop +36jmp +341acc -12nop +580acc -9jmp +112acc +12acc +6acc +40acc +1jmp +237acc +50jmp +61nop +542jmp +644nop +598nop +280acc +34acc +10jmp +486acc +34nop +152acc +35jmp +629acc +37jmp +447acc +50nop +522acc +43jmp +271jmp +451acc +27jmp +1acc +24nop +532jmp +494acc +39acc -10acc +42acc -9jmp +54acc +36jmp +236acc +34acc +47nop +613acc +27jmp +561acc +3acc -5acc +11acc +19jmp +111acc +32nop -52jmp +108acc -16acc +40jmp +207nop -44acc +47jmp +159nop +150acc +43acc +7jmp +200nop +141acc +2jmp +487acc +27nop +122nop +519jmp +22nop +27nop +251acc -2jmp +171acc -11jmp +242acc +14acc -11jmp +540acc -5acc +47acc +14jmp +252acc +34acc +28acc +1jmp +311jmp +1acc +28acc +0jmp +321acc +23acc +8acc +26acc +0jmp +202jmp +541acc +21acc -9acc +7jmp +81acc +5acc +31acc -16jmp +56acc -1acc +21acc +45acc -7jmp +278acc +0acc +2acc -4jmp +514acc -1acc -16acc +32jmp +248acc +25jmp +333acc -18acc +0acc +25acc +43jmp +416acc +18nop -127acc +37acc -4jmp +495nop +16jmp +1jmp +320acc +22jmp +453acc -3nop +519nop +49jmp +32jmp -89acc +11acc +31jmp +454acc +12acc +32jmp +283acc -2nop +411jmp -65acc +0nop +25acc +5acc +0jmp +284acc -15jmp +1jmp +166acc +27acc +50jmp +91jmp -104nop +71jmp +358acc +15acc +1jmp -60acc +20acc +6acc +10jmp +228acc -3jmp +316acc +5acc +11jmp +254acc -3acc +20jmp +194acc +9acc -8jmp +6acc +30jmp +376acc -19acc -8jmp -122jmp +3nop -41jmp -68jmp -119nop +434acc -16nop -199acc +37jmp +68acc +3acc +18acc +38acc -8jmp +327nop +110acc +9acc +31jmp -8jmp +130acc +20acc -1nop +16jmp +24nop +14nop -40nop -57acc +10jmp +239nop +164nop +196jmp -208acc -12jmp +284acc +10acc +27jmp +1jmp -195acc +1acc +10acc +25acc -17jmp +25acc +42acc +1acc -3jmp -148jmp -28acc +34nop -222acc +3acc +15jmp +115acc +26acc +36acc +33jmp -248acc -14jmp -89acc +19acc -14acc +34jmp +380jmp +1jmp -5jmp +187jmp +236acc -4acc +47jmp +2jmp +232jmp +1acc -8jmp +397acc +7acc +2jmp +136jmp +325acc +11acc -17acc -4jmp -43acc +20acc -9jmp +60acc +36acc +49nop +333acc +38jmp -169acc +2acc +8jmp +82acc +6jmp -159acc +25acc +23acc +18acc +41jmp -138jmp -145acc +49acc +37jmp +123acc +2nop +179acc -19jmp -152jmp -294acc +50acc +50jmp -46acc +17jmp -158acc -11acc +5acc -6jmp +278acc +3acc +26acc +27acc +24jmp -69acc +22jmp +204acc +15acc +49acc +1acc +22jmp +149acc +31jmp +131jmp -309acc +40acc +39acc +44jmp -216acc +15acc +17jmp +54nop +157acc +24acc +18jmp -111acc -6jmp +22acc +17acc -3jmp -228acc -2acc +41jmp +235nop +234jmp -82nop -83acc +44acc +39nop +216jmp -180jmp -163acc +13acc +0jmp +1jmp +301acc +14nop -187jmp -181acc +48nop +169acc +27jmp -334nop -226acc +3jmp -61jmp +1acc -15jmp -175acc +9acc +19jmp +223acc +20acc +39acc +50acc +13jmp -119jmp +240acc +50acc +40acc -14jmp +236acc +0acc +0jmp +34acc +20acc -3nop -136acc +4jmp -370acc +38acc +25acc +9jmp -240jmp +1acc -10acc +21acc +46jmp +118acc -8acc +12nop +64acc +0jmp +253acc +32acc -6acc +44jmp +115acc +36acc +23acc +21nop +88jmp -275acc +8jmp -127acc +5acc +42jmp +82acc +41acc +31acc +45acc +20jmp +131acc +21acc +7jmp +97acc +12acc +0nop +61acc +36jmp -106acc +20acc -1acc -14jmp -210acc -12acc -19acc -19jmp -25acc -11nop -247acc +0acc +7jmp -290acc +36acc +43acc +8nop -154jmp -102acc +8acc +31acc +44acc -5jmp -184jmp -252acc +50acc +18acc +5jmp -141jmp -159acc -4acc +8acc +4acc -5jmp +56acc +19acc +46jmp +53acc +45jmp -316acc -5acc -1nop +98jmp +195jmp +1jmp +58acc +15nop -471acc +14jmp +48nop -269nop +8nop -223acc +24jmp -288jmp +85nop -1jmp +1jmp +45acc +48nop -490acc +0jmp +37jmp +132acc +5jmp -256acc +12acc +22jmp -479acc +15nop -56acc -18acc -6jmp -157nop +16acc +5acc +26acc +42jmp -172acc -13acc -2jmp -237acc +9acc -10acc -16jmp +32acc +11acc +3jmp -208jmp -449jmp -383jmp +96acc -9acc -14jmp -30nop -36jmp +21jmp +117jmp -169jmp -387acc -5acc -9jmp -344acc +13acc +4acc +45jmp -219acc +9acc +44acc +31acc +16jmp -71jmp -77acc -1acc +40acc +31jmp -385acc +1jmp -255nop -20acc +0acc +29jmp -180acc +13acc +5nop -292jmp -204acc +30jmp -265acc +19acc +31jmp -457acc +16acc +27jmp +67jmp +88acc +20acc +44acc +27jmp -40acc +26acc +48acc +28acc -12jmp -120acc -9acc +42jmp -543acc +4nop +83acc +41jmp -28acc +40acc -17acc +14acc -6jmp -70nop -294acc -10acc +9acc +7jmp -322jmp +1jmp -46acc +0acc +38acc +6jmp -381acc +49acc -16acc +35acc +45jmp -184acc -6acc -13acc +9jmp -180acc +18acc +49acc -4nop -197jmp -395nop -266jmp -530acc +16acc +9jmp -117acc -4acc -7acc +44acc +35jmp -122acc +31acc -5jmp -503jmp -555acc +19acc +25acc -10acc +50jmp -493jmp -591acc +40jmp -491nop +28nop -48acc +11nop -25jmp -591jmp +1acc -15acc +21acc +46jmp -199jmp +1acc +42acc +10acc -11jmp -213acc -8acc +2acc +36jmp -470acc +37jmp -195jmp -38acc +17jmp -26nop -376acc +27acc +11jmp -185acc +44acc +12acc +9acc +14jmp -626jmp -89acc +45acc +23acc +13acc +19jmp +1
import Data.Listimport qualified Data.Map as Mimport Data.Maybeimport qualified Data.Set as Sdata Command = Nop Int | Acc Int | Jmp Int deriving Showdata State =St{ acc :: Int, pc :: Int, prog :: M.Map Int Command} deriving Show(!?) = (M.!?)parse :: String -> Stateparse = St 0 0 . M.fromList . zip [0..] . map readCmd . lineswherereadCmd ('n':'o':'p':_:'+':rest) = Nop $ read restreadCmd ('n':'o':'p':_:rest) = Nop $ read restreadCmd ('a':'c':'c':_:'+':rest) = Acc $ read restreadCmd ('a':'c':'c':_:rest) = Acc $ read restreadCmd ('j':'m':'p':_:'+':rest) = Jmp $ read restreadCmd ('j':'m':'p':_:rest) = Jmp $ read restrunCmd :: State -> Command -> StaterunCmd (St acc pc prog) cmd =case cmd ofNop _ -> St acc (pc+1) progAcc i -> St (acc+i) (pc+1) progJmp i -> St acc (pc+i) progstep :: State -> Maybe Statestep st = runCmd st <$> prog st !? pc stsolve1 :: State -> Intsolve1 = go S.emptywherego seen st =if pc st `S.member` seenthen acc stelse go (S.insert (pc st) seen) $ fromJust $ step stmods :: State -> [State]mods st =St 0 0 <$> (map M.fromList $ flipOne $ M.toList $ prog st)whereflipOne [] = []flipOne (v@(idx,Nop i):rest) = ((idx,Jmp i):rest) : map (v:) (flipOne rest)flipOne (v@(idx,Jmp i):rest) = ((idx,Nop i):rest) : map (v:) (flipOne rest)flipOne (oth:rest) = map (oth:) $ flipOne restrun :: State -> Maybe Intrun = go S.emptywherego seen st =if pc st `S.member` seenthen Nothingelse case step st ofNothing -> Just $ acc stJust st' -> go (S.insert (pc st) seen) st'solve2 :: State -> Maybe Intsolve2 = foldl' findJust Nothing . map run . modswherefindJust (Just a) _ = Just afindJust _ (Just a) = Just afindJust Nothing Nothing = Nothing