From fbf0e75d8eb6fe6022d16ebfad187b8101832649 Mon Sep 17 00:00:00 2001 From: Gattix Date: Fri, 16 Dec 2022 03:10:16 +0100 Subject: [PATCH] day 14 --- 2022/day14/day14.hs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 2022/day14/day14.hs diff --git a/2022/day14/day14.hs b/2022/day14/day14.hs new file mode 100644 index 0000000..ea831ff --- /dev/null +++ b/2022/day14/day14.hs @@ -0,0 +1,43 @@ +import Control.Lens +import qualified Data.HashSet as H +import Data.List +import Data.List.Split +import Linear.V2 + +type Cave = H.HashSet (V2 Int) + +main :: IO () +main = do + input <- map (map (splitOn ",") . splitOn " -> ") . lines <$> readFile "input" + let cave = H.fromList $ concatMap toV2 input + let getMaxY = maximum . map (^. _y) . H.toList + let f x = length (H.toList x \\ H.toList cave) + let part1 = f $ day14 (getMaxY cave) True cave + let part2 = f $ day14 (getMaxY cave) False cave + putStrLn $ "Part 1: " ++ show part1 ++ "\nPart 2: " ++ show part2 + +day14 :: Int -> Bool -> Cave -> Cave +day14 maxY mode cave = + if cave == newCave + then cave + else day14 maxY mode newCave + where + newCave = fallDown maxY mode (V2 500 0) cave + +toV2 :: [[String]] -> [V2 Int] +toV2 ([x1, y1]:[x2, y2]:xs) = + [V2 i j | i <- f [x1, x2], j <- f [y1, y2]] ++ toV2 ([x2, y2] : xs) + where + f = (\[x, y] -> [x .. y]) . sort . map read +toV2 _ = [] + +fallDown :: Int -> Bool -> V2 Int -> Cave -> Cave +fallDown maxY mode start cave + | not mode && start ^. _y == maxY + 1 = H.insert start cave + | mode && start ^. _y >= maxY = cave + | f (V2 0 1) cave = fallDown maxY mode (start + V2 0 1) cave + | f (V2 (-1) 1) cave = fallDown maxY mode (start + V2 (-1) 1) cave + | f (V2 1 1) cave = fallDown maxY mode (start + V2 1 1) cave + | otherwise = H.insert start cave + where + f x = not . H.member (start + x)