30 lines
1.0 KiB
Haskell
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
|