{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import Data.List (sort)
import Data.Text (Text, pack, splitOn, unpack)
    

part1 :: String -> Integer
part1 str = findMax lines' [] 0
  where
    lines' = lines str
    findMax [] acc cMax = max (sum acc) cMax
    findMax ("":xs) acc cMax = findMax xs [] $ max (sum acc) cMax
    findMax (x:xs) acc cMax = findMax xs ((read x):acc) cMax

chunkElves :: Text -> [Integer]
chunkElves t = integers
  where
    textChunks = splitOn "\n\n" t
    integerChunks = map (map read . words . unpack) textChunks
    integers = map sum integerChunks

part2 :: String -> Integer 
part2 str = sum $ take 3 $ reverse $ sort $ chunkElves $ pack str

main :: IO ()
main = do
  contents <- getContents

  putStrLn $ show $ part2 contents