Another December, another Advent of Code!
Day 1 was another gentle warmup, where I spent most of my time looking at the Data.List.Split library and not seeing the function I needed.
I needed to convert the input into a list of groups of numbers. lines
would split the input into lines, then I eventually noticed splitWhen
in Data.List.Split did exactly what I needed to split the data into groups. Nested mappings of read
did the conversion into numbers.
At this point, part 1 was summing the groups and finding the largest sum. Part 2 involved sorting the group totals and summing the largest three. The code is a direct expression of the problem.
main :: IO ()
main =
do dataFileName <- getDataFileName
numStrs <- readFile dataFileName
let calories = fmap (fmap (read @Int)) $ splitWhen null $ lines numStrs
print $ part1 calories
print $ part2 calories
part1 :: [[Int]] -> Int
part1 = maximum . fmap sum
part2 :: [[Int]] -> Int
part2 = sum . take 3 . reverse . sort . fmap sum
Code
You can get the code from my locally-hosted Git repo, or from Gitlab.