summaryrefslogtreecommitdiff
path: root/2020/8.hs
diff options
context:
space:
mode:
Diffstat (limited to '2020/8.hs')
-rw-r--r--2020/8.hs35
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))