Better version of advent06
[advent-of-code-16.git] / advent06.hs
1 -- Better version of advent06.hs, using more standard library functions.
2
3 module Main(main) where
4
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
9
10 main :: IO ()
11 main = do
12 text <- readFile "advent06.txt"
13 let message = lines text
14 part1 message
15 part2 message
16
17 part1 :: [String] -> IO ()
18 part1 message = do
19 putStrLn $ map (fst) $ map (mostCommon) $ map (countedLetters) $ transpose message
20
21 part2 :: [String] -> IO ()
22 part2 message = do
23 putStrLn $ map (fst) $ map (leastCommon) $ map (countedLetters) $ transpose message
24
25 countedLetters :: String -> [(Char, Int)]
26 countedLetters name = Map.toList $ Map.fromListWith (+) [(c, 1) | c <- filter (isLetter) name]
27
28 mostCommon :: [(Char, Int)] -> (Char, Int)
29 mostCommon = swap . maximum . map (swap)
30
31 leastCommon :: [(Char, Int)] -> (Char, Int)
32 leastCommon = swap . minimum . map (swap)