

I thought this was going to be the knapsack problem, but no.
import Control.Monad
import Data.List.Split
import qualified Data.Set as Set
import qualified Data.Multiset as MSet
part1, part2, part3 :: [Int] -> Int
part1 = sum . Set.fromList
part2 = sum . Set.take 20 . Set.fromList
part3 = maximum . MSet.toCountMap . MSet.fromList
main =
forM_
[ ("everybody_codes_e2025_q03_p1.txt", part1),
("everybody_codes_e2025_q03_p2.txt", part2),
("everybody_codes_e2025_q03_p3.txt", part3)
]
$ \(input, solve) ->
readFile input >>= print . solve . map read . splitOn ","




I liked this one!