Merge branch 'master' of git.njae.me.uk:advent-of-code-16
[advent-of-code-16.git] / advent08.hs
index 0c5987c6204041b08463e25bd664868c39bbd97c..7def6d1224d649bc1ce85097e151d2ff64f5a409 100644 (file)
@@ -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