mirror of
https://github.com/mx42/adventofcode.git
synced 2026-01-14 05:49:52 +01:00
48 lines
1.2 KiB
Haskell
48 lines
1.2 KiB
Haskell
import Data.List.Split
|
|
|
|
computeSides :: [Int] -> [Int]
|
|
computeSides dims = [l * w, w * h, h * l]
|
|
-- Not really safe...
|
|
where l = dims !! 0
|
|
w = dims !! 1
|
|
h = dims !! 2
|
|
|
|
computeWrapping :: [Int] -> Int
|
|
computeWrapping dims = sum (map (* 2) sides)
|
|
where sides = computeSides dims
|
|
|
|
computeSlack :: [Int] -> Int
|
|
computeSlack dims = minimum sides
|
|
where sides = computeSides dims
|
|
|
|
computeRibbonWrap :: [Int] -> Int
|
|
computeRibbonWrap dims = (sum dims - maximum dims) * 2
|
|
|
|
computeRibbonBow :: [Int] -> Int
|
|
computeRibbonBow dims = product dims
|
|
|
|
parseDims :: String -> [Int]
|
|
parseDims input = map read (splitOn "x" input)
|
|
|
|
part1computation :: [Int] -> Int
|
|
part1computation dims = computeWrapping dims + computeSlack dims
|
|
|
|
part2computation :: [Int] -> Int
|
|
part2computation dims = computeRibbonWrap dims + computeRibbonBow dims
|
|
|
|
day2 :: ([Int] -> Int) -> String -> Int
|
|
day2 fn input = sum paper
|
|
where entries = lines input
|
|
dims = map parseDims entries
|
|
paper = map fn dims
|
|
|
|
main :: IO ()
|
|
main = do
|
|
input <- getContents
|
|
putStr "Part1: "
|
|
print (day2 part1computation input)
|
|
putStrLn ""
|
|
putStr "Part2: "
|
|
print (day2 part2computation input)
|
|
putStrLn ""
|