Added version of day 18 that uses a fold. It's more complex and slower.
authorNeil Smith <neil.git@njae.me.uk>
Sun, 18 Dec 2016 11:19:23 +0000 (11:19 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Sun, 18 Dec 2016 11:19:23 +0000 (11:19 +0000)
advent18.hs
advent18f.hs [new file with mode: 0644]

index a96251a04dc7c511382adcc870ce99a632b8340e..e7c304fe9f1bf7b77fcf5e59edb08ce013e428b9 100644 (file)
@@ -1,4 +1,4 @@
-import Data.List (iterate, tails)
+import Data.List (tails)
 
 -- input = "..^^."
 -- input = ".^^.^.^^^^"
diff --git a/advent18f.hs b/advent18f.hs
new file mode 100644 (file)
index 0000000..f643ff5
--- /dev/null
@@ -0,0 +1,48 @@
+import Data.List (tails)
+
+-- input = "..^^."
+-- input = ".^^.^.^^^^"
+input = "^.^^^.^..^....^^....^^^^.^^.^...^^.^.^^.^^.^^..^.^...^.^..^.^^.^..^.....^^^.^.^^^..^^...^^^...^...^."
+
+main :: IO ()
+main = do 
+        part1 
+        part2
+
+part1 :: IO ()
+part1 = print $ fst $ foldl nextRowFold (countSafe row, row) [2..40]
+    where row = readRow input
+
+part2 :: IO ()
+part2 = print $ fst $ foldl nextRowFold (countSafe row, row) [2..400000]
+    where row = 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
+
+nextRowFold :: (Int, [Bool]) -> Int -> (Int, [Bool])
+nextRowFold (n, row) _ = (n + countSafe newRow, newRow)
+    where newRow = nextRow row
+
+countSafe :: [Bool] -> Int
+countSafe = length . filter (not)
+
+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