X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent18.hs;fp=advent18.hs;h=04ab345e5522feb8001434ab9174c3cffdc8e693;hb=6c33fcf371ca6d7c86e6cb79cc7de5d8af41181b;hp=0000000000000000000000000000000000000000;hpb=89d895a08ce6055bba3649f3178e76c3e5170ae3;p=advent-of-code-16.git diff --git a/advent18.hs b/advent18.hs new file mode 100644 index 0000000..04ab345 --- /dev/null +++ b/advent18.hs @@ -0,0 +1,42 @@ +import Data.List (iterate, tails) + +-- input = "..^^." +-- input = ".^^.^.^^^^" +input = "^.^^^.^..^....^^....^^^^.^^.^...^^.^.^^.^^.^^..^.^...^.^..^.^^.^..^.....^^^.^.^^^..^^...^^^...^...^." + + +main :: IO () +main = do + part1 + part2 + + +part1 :: IO () +-- part1 = putStrLn $ unlines $ map (showRow) $ take 10 $ iterate nextRow $ readRow input +part1 = print $ length $ filter (not) $ concat $ take 40 $ iterate nextRow $ readRow input + +part2 :: IO () +part2 = print $ length $ filter (not) $ concat $ take 400000 $ iterate nextRow $ readRow input + +readRow :: String -> [Bool] +readRow = map (=='^') + +showRow :: [Bool] -> String +showRow = map (\c -> if c then '^' else '.') + +extended :: [Bool] -> [Bool] +extended row = [False] ++ row ++ [False] + +nextRow :: [Bool] -> [Bool] +nextRow = map (isTrap) . segments . extended + +segments :: [a] -> [[a]] +segments = filter ((==3) . length) . map (take 3) . tails + +isTrap :: [Bool] -> Bool +isTrap segment + | segment == [True, True, False] = True + | segment == [False, True, True] = True + | segment == [True, False, False] = True + | segment == [False, False, True] = True + | otherwise = False