advent-of-code/2015/haskell/solutions/Day02.hs
2024-08-01 00:22:03 +02:00

36 lines
870 B
Haskell

module Day02 (parse, solveA, solveB) where
import Data.List (sort, tails)
splitOn :: (Eq a) => a -> [a] -> [[a]]
splitOn _ [] = []
splitOn delimiter xs =
let (before, remainder) = break (== delimiter) xs
in before : case remainder of
[] -> []
_ : rest -> splitOn delimiter rest
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
calculate :: [Int] -> Int
calculate sides = (sum . map (2 *)) sides + minimum sides
solveA :: [[Int]] -> Int
solveA = sum . map toArea
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