XBFD2LCETFWTGOBVX4XVCYDCFJTR6NRF3LXPAJYPJKI6WCZECIMQC noopnoopnoopnoopaddx 5addx 5noopaddx 3noopaddx 2addx 1noopnoopnoopaddx 4addx -4addx 7addx 7noopaddx -2addx 5addx -23addx 26addx -38noopnoopnoopaddx 3addx 2addx 5addx 2addx 9addx -8addx 2addx 16addx -9addx 3addx -2addx 2noopaddx 7addx -2addx 5addx 2addx 3noopaddx -40addx 5noopaddx 2addx -6addx 11addx -1addx 3addx 3noopnoopnoopaddx 5addx -2noopaddx 7addx 8addx -2addx -3addx 5addx 2addx -10addx -26addx 1noopaddx 8addx -5addx 4addx 3addx -3addx 4addx 2addx -9addx 16addx 2noopaddx 3addx 3addx 2addx -2addx 5addx 2addx 2noopaddx -38addx 34addx -28addx -2addx 5addx 2addx 3addx -2addx 2addx 7noopnoopaddx -4addx 5addx 2addx 15addx -8addx 3noopaddx 2addx -8addx 9addx -38addx 26noopaddx -18noopnoopaddx 4addx 4addx -3addx 2addx 20addx -12noopnoopnoopaddx 4addx 1noopaddx 5noopnoopaddx 5noopnoopnoopnoopnoopnoopnoop
addx 15addx -11addx 6addx -3addx 5addx -1addx -8addx 13addx 4noopaddx -1addx 5addx -1addx 5addx -1addx 5addx -1addx 5addx -1addx -35addx 1addx 24addx -19addx 1addx 16addx -11noopnoopaddx 21addx -15noopnoopaddx -3addx 9addx 1addx -3addx 8addx 1addx 5noopnoopnoopnoopnoopaddx -36noopaddx 1addx 7noopnoopnoopaddx 2addx 6noopnoopnoopnoopnoopaddx 1noopnoopaddx 7addx 1noopaddx -13addx 13addx 7noopaddx 1addx -33noopnoopnoopaddx 2noopnoopnoopaddx 8noopaddx -1addx 2addx 1noopaddx 17addx -9addx 1addx 1addx -3addx 11noopnoopaddx 1noopaddx 1noopnoopaddx -13addx -19addx 1addx 3addx 26addx -30addx 12addx -1addx 3addx 1noopnoopnoopaddx -9addx 18addx 1addx 2noopnoopaddx 9noopnoopnoopaddx -1addx 2addx -37addx 1addx 3noopaddx 15addx -21addx 22addx -6addx 1noopaddx 2addx 1noopaddx -10noopnoopaddx 20addx 1addx 2addx 2addx -6addx -11noopnoopnoop
module Main whereimport Data.Charimport Data.Listimport Data.Foldableimport Data.Functor.Identityimport Control.Monad.Stateimport Text.ParserCombinators.ReadP hiding (get)import Aocmain :: IO ()main = docontent <- lines <$> input 10print $ part1 contentwherestate = flip evalState (0, 1) . sequence . map instruction . parsepart1 = sum . calculateSignalStrength . statecalculateSignalStrength :: [(Cycle, RegX)] -> [Int]calculateSignalStrength = go 20wherego :: Int -> [(Cycle, RegX)] -> [Int]go 220 xs = [(*220) . snd . last . fst $ every20th 220 xs]go cycle xs = ((*cycle) . snd . last . fst $ every20th cycle xs) : (go (cycle + 40) . snd $ every20th cycle xs)every20th cycle = span ((<cycle) . fst)data Instruction = AddX Int | Noopcycles :: Instruction -> Intcycles (AddX _) = 2cycles Noop = 1type Cycle = Inttype RegX = Intinstruction :: Instruction -> StateT (Cycle, RegX) Identity (Cycle, RegX)instruction x = do(cycle, regx) <- getlet newCycle = cycle + cycles xlet newRegX = regx + (case x ofNoop -> 0(AddX a) -> a)put (newCycle, newRegX)pure (newCycle, newRegX)parseNoop :: ReadP InstructionparseNoop = dostring "noop"pure NoopparseAddX :: ReadP InstructionparseAddX = dostring "addx"skipSpacesn <- read <$> munch1 numpure $ AddX nwherenum c = isDigit c || c == '-'parseInstruction :: ReadP InstructionparseInstruction = choice [parseNoop, parseAddX]parse :: [String] -> [Instruction]parse = map (fst . head . readP_to_S parseInstruction)