import Data.List.Split (splitOn) import Data.List (sort) part1 :: [Integer] -> IO () part1 = (>>) (putStr "part 1: ") . print . maximum part2 :: [Integer] -> IO () part2 = (>>) (putStr "part 2: ") . print . sum . take 3 . reverse . sort rmap :: [a -> b] -> a -> [b] rmap xs a = map (\f -> f a) xs main :: IO () main = do getContents >>= (sequence_ . rmap [part1, part2]) . map (sum . map read) . splitOn [""] . lines