From fc5af8bb0bb2bbc21ae6f3423c6390028e74324d Mon Sep 17 00:00:00 2001 From: eriedaberrie Date: Thu, 14 Dec 2023 15:35:02 -0800 Subject: [PATCH] 2023 day 11: Haskell solution --- 2023/11/Main1.hs | 28 ++++++++++++++++++++++++++++ 2023/11/Main2.hs | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 2023/11/Main1.hs create mode 100644 2023/11/Main2.hs diff --git a/2023/11/Main1.hs b/2023/11/Main1.hs new file mode 100644 index 0000000..622b31a --- /dev/null +++ b/2023/11/Main1.hs @@ -0,0 +1,28 @@ +import Data.List (scanl', tails, transpose) +import Data.Function (on) +import Data.Bool (bool) + +expandEmpty :: Int +expandEmpty = 2 + +sumDistances :: (Int, Int) -> [(Int, Int)] -> Int +sumDistances (n, d) = sum . map sumDistance + where + sumDistance (n', d') = n' * n * (d' - d) + +genDistances :: [Int] -> [Int] +genDistances = scanl' (flip $ (+) . bool 1 expandEmpty . (== 0)) 0 + +solveDirection :: [String] -> Int +solveDirection = sum + . (zipWith sumDistances <*> tail . tails) + . (zip <*> genDistances) + . map countHashes + where + countHashes = length . filter (== '#') + +solveAll :: [String] -> Int +solveAll = ((+) `on` solveDirection) <*> transpose + +main :: IO () +main = print . solveAll . lines =<< readFile "data.txt" diff --git a/2023/11/Main2.hs b/2023/11/Main2.hs new file mode 100644 index 0000000..ad10684 --- /dev/null +++ b/2023/11/Main2.hs @@ -0,0 +1,28 @@ +import Data.List (scanl', tails, transpose) +import Data.Function (on) +import Data.Bool (bool) + +expandEmpty :: Int +expandEmpty = 1000000 + +sumDistances :: (Int, Int) -> [(Int, Int)] -> Int +sumDistances (n, d) = sum . map sumDistance + where + sumDistance (n', d') = n' * n * (d' - d) + +genDistances :: [Int] -> [Int] +genDistances = scanl' (flip $ (+) . bool 1 expandEmpty . (== 0)) 0 + +solveDirection :: [String] -> Int +solveDirection = sum + . (zipWith sumDistances <*> tail . tails) + . (zip <*> genDistances) + . map countHashes + where + countHashes = length . filter (== '#') + +solveAll :: [String] -> Int +solveAll = ((+) `on` solveDirection) <*> transpose + +main :: IO () +main = print . solveAll . lines =<< readFile "data.txt"