X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent08.hs;h=7def6d1224d649bc1ce85097e151d2ff64f5a409;hb=3fef2ec4e8e9981203b1df48f986999217774fc0;hp=0c5987c6204041b08463e25bd664868c39bbd97c;hpb=d2d274d6990859e8d32f7f7416fcd7d6c062b6ea;p=advent-of-code-16.git diff --git a/advent08.hs b/advent08.hs index 0c5987c..7def6d1 100644 --- a/advent08.hs +++ b/advent08.hs @@ -19,43 +19,35 @@ mkScreen :: Int -> Int -> Screen mkScreen w h = array ((0, 0), (h - 1, w - 1)) [((i, j), False) | i <- [0..(h-1)], j <- [0..(w-1)]] - showScreen :: Screen -> String showScreen screen = unlines [showRow r | r <- [minRow..maxRow]] where ((minRow, minCol), (maxRow, maxCol)) = bounds screen - showCell True = '#' - showCell False = '.' + showCell True = '*' + showCell False = ' ' showRow r = [showCell (screen!(r, c)) | c <- [minCol..maxCol]] countLights :: Screen -> Int countLights screen = length $ filter (id) $ elems screen +screen0 :: Screen screen0 = mkScreen 50 6 -instrs = [ Rect 3 2 - , Rotate Column 1 1 - , Rotate Row 0 4 - , Rotate Column 1 1 - , Rotate Row 1 6 - , Rotate Row 2 8 - , Rect 1 3 - ] main :: IO () main = do text <- readFile "advent08.txt" let instrs = successfulParse $ parseCommands text - -- print instrs part1 instrs part2 instrs part1 :: [Command] -> IO () -part1 instructions = - putStrLn $ showScreen $ (extractScreen . doInstructions) instructions +part1 commands = + print $ countLights $ (extractScreen . doCommands) commands part2 :: [Command] -> IO () -part2 instructions = - print $ countLights $ (extractScreen . doInstructions) instructions +part2 commands = + putStrLn $ showScreen $ (extractScreen . doCommands) commands + instance Functor ScState where fmap = liftM @@ -64,7 +56,7 @@ instance Applicative ScState where pure = return (<*>) = ap -instance Monad (ScState) where +instance Monad ScState where return x = ScState (\screen -> (screen, x)) (ScState st) >>= f @@ -74,20 +66,26 @@ instance Monad (ScState) where in transformer newScreen) -doInstructions [] = return 0 -doInstructions (i:is) = - do doInstruction i - doInstructions is +doCommands :: [Command] -> ScState (Int) +doCommands [] = return 0 +doCommands (i:is) = + do doCommand i + doCommands is return 0 -doInstruction i = ScState (execute i) +doCommand :: Command -> ScState Int +doCommand i = ScState (execute i) +execute :: Command -> (Screen -> (Screen, Int)) execute (Rect w h) screen = (rect screen w h, 0) execute (Rotate Column c n) screen = (rotateColumn screen c n, 0) execute (Rotate Row r n) screen = (rotateRow screen r n, 0) +extractScreen :: ScState Int -> Screen extractScreen (ScState st) = fst (st screen0) + + parseCommands :: String -> Either ParseError [Command] parseCommands input = parse commandFile "(unknown)" input