adventofcode/2022/day10.hs

30 lines
1.0 KiB
Haskell

import qualified Vm
import Control.Monad.Trans.State as St
import qualified Data.Map as M
import Data.Maybe (fromJust, fromMaybe)
import Data.List.Split (chunksOf)
mapS :: s -> [St.State s a] -> [s]
mapS init [] = []
mapS init (x:xs) = let s = execState x init in s : mapS s xs
main :: IO ()
main = do
program <- Vm.readProgram
let states = mapS Vm.initState (fmap Vm.eval program)
let statesM = M.fromList $ zip (map Vm.step states) (map Vm.regx states)
print statesM
putStr "part 1: "
let cycles = [20, 60, 100, 140, 180, 220]
let strengths = map (\i -> i * snd (fromJust $ (i-1) `M.lookupLE` statesM)) cycles :: [Integer]
print $ sum strengths
putStrLn "parts 2: "
let finalIter = fst $ fromJust $ M.lookupMax statesM
let signals = zip [0..] $ map (\i -> snd (fromMaybe (0,1) $ (i-1) `M.lookupLE` statesM)) [1..finalIter]
let crt = map (\(i, s) -> let p = i `mod` 40 in p >= s-1 && p <= s+1) signals
print signals
mapM_ putStrLn $ chunksOf 40 $ map (\b -> if b then '#' else ' ') crt