2024-07-30 01:11:49 +02:00
|
|
|
module Day02 (parse, solveA, solveB) where
|
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
import Data.List (sort, tails)
|
|
|
|
|
2024-07-30 01:11:49 +02:00
|
|
|
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
|
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
pairs :: [a] -> [(a, a)]
|
|
|
|
pairs xs = [(x, y) | (x : ys) <- tails xs, y <- ys]
|
2024-07-30 01:11:49 +02:00
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
parse :: String -> [[Int]]
|
|
|
|
parse = map (map read . splitOn 'x') . lines
|
2024-07-30 01:11:49 +02:00
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
toArea :: [Int] -> Int
|
|
|
|
toArea = calculate . map (uncurry (*)) . pairs
|
|
|
|
where
|
|
|
|
calculate :: [Int] -> Int
|
|
|
|
calculate sides = (sum . map (2 *)) sides + minimum sides
|
2024-07-30 01:11:49 +02:00
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
solveA :: [[Int]] -> Int
|
|
|
|
solveA = sum . map toArea
|
2024-07-30 01:11:49 +02:00
|
|
|
|
2024-08-01 00:22:03 +02:00
|
|
|
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
|