1 -- Better version of advent06.hs, using more standard library functions.
3 module Main(main) where
5 import Data.List (transpose, maximum, minimum)
6 import Data.Char (isLetter)
7 import Data.Tuple (swap)
8 import qualified Data.Map.Lazy as Map
12 text <- readFile "advent06.txt"
13 let message = lines text
17 part1 :: [String] -> IO ()
19 putStrLn $ map (fst) $ map (mostCommon) $ map (countedLetters) $ transpose message
21 part2 :: [String] -> IO ()
23 putStrLn $ map (fst) $ map (leastCommon) $ map (countedLetters) $ transpose message
25 countedLetters :: String -> [(Char, Int)]
26 countedLetters name = Map.toList $ Map.fromListWith (+) [(c, 1) | c <- filter (isLetter) name]
28 mostCommon :: [(Char, Int)] -> (Char, Int)
29 mostCommon = swap . maximum . map (swap)
31 leastCommon :: [(Char, Int)] -> (Char, Int)
32 leastCommon = swap . minimum . map (swap)