From 227b01bd0f3cab4f51cb30ee30ab837c87402be6 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Thu, 1 Aug 2024 00:22:03 +0200 Subject: [PATCH] haskell: 2015 02b --- 2015/haskell/haskell.cabal | 3 ++- 2015/haskell/solutions/Day02.hs | 37 +++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/2015/haskell/haskell.cabal b/2015/haskell/haskell.cabal index 0bb9fe5..b35249b 100644 --- a/2015/haskell/haskell.cabal +++ b/2015/haskell/haskell.cabal @@ -36,7 +36,8 @@ executable haskell -- LANGUAGE extensions used by modules in this package. -- other-extensions: build-depends: - base >=4.16.4.0, + base >= 4.16.4.0, + text >= 2.1.1, aoc2015, hs-source-dirs: app diff --git a/2015/haskell/solutions/Day02.hs b/2015/haskell/solutions/Day02.hs index cff0569..cb4ef8a 100644 --- a/2015/haskell/solutions/Day02.hs +++ b/2015/haskell/solutions/Day02.hs @@ -1,5 +1,7 @@ module Day02 (parse, solveA, solveB) where +import Data.List (sort, tails) + splitOn :: (Eq a) => a -> [a] -> [[a]] splitOn _ [] = [] splitOn delimiter xs = @@ -8,23 +10,26 @@ splitOn delimiter xs = [] -> [] _ : rest -> splitOn delimiter rest -parse :: String -> [(Int, Int, Int)] -parse = map toTuple . lines +pairs :: [a] -> [(a, a)] +pairs xs = [(x, y) | (x : ys) <- tails xs, y <- ys] + +parse :: String -> [[Int]] +parse = map (map read . splitOn 'x') . lines + +toArea :: [Int] -> Int +toArea = calculate . map (uncurry (*)) . pairs where - toTuple :: String -> (Int, Int, Int) - toTuple str = let [a, b, c] = splitOn 'x' str in (read a, read b, read c) + calculate :: [Int] -> Int + calculate sides = (sum . map (2 *)) sides + minimum sides -toArea :: (Int, Int, Int) -> Int -toArea (l, w, h) = - let a = l * w - b = w * h - c = h * l - in 2 * a + 2 * b + 2 * c + min a (min b c) - -solveA :: [(Int, Int, Int)] -> Int +solveA :: [[Int]] -> Int solveA = sum . map toArea --- >>> map toArea $ parse "2x3x4" --- [64] - -solveB = undefined +solveB :: [[Int]] -> Int +solveB = sum . map calcWrap + where + calcWrap :: [Int] -> Int + calcWrap dims = + let wrap = (2 *) . sum . take 2 $ sort dims + bow = product dims + in wrap + bow