4d99fd2930df872e7febb52274966a72521a4b5a
[advent-of-code-16.git] / advent06.hs
1 module Main(main) where
2
3 import Data.List (last, intersperse, sortBy, intercalate, isInfixOf, transpose)
4 import Data.List.Split (splitOn)
5 import Data.Char (isLetter, ord, chr)
6 import qualified Data.Map.Lazy as Map
7
8
9 input = "cxdnnyjw"
10
11 main :: IO ()
12 main = do
13 text <- readFile "advent06.txt"
14 let message = lines text
15 part1 message
16 part2 message
17
18
19 part1 :: [String] -> IO ()
20 part1 message = do
21 print $ map (fst) $ map (mostCommon) $ map (countedLetters) $ transpose message
22
23 part2 :: [String] -> IO ()
24 part2 message = do
25 print $ map (fst) $ map (leastCommon) $ map (countedLetters) $ transpose message
26
27
28
29 countedLetters :: String -> Map.Map Char Int
30 countedLetters name = Map.fromListWith (+) [(c, 1) | c <- filter (isLetter) name]
31
32 mostCommon = Map.foldlWithKey (mostCommonP) ('a', 0)
33
34 mostCommonP (letter0, count0) letter count
35 | count > count0 = (letter, count)
36 | otherwise = (letter0, count0)
37
38 leastCommon = Map.foldlWithKey (leastCommonP) ('a', maxBound :: Int)
39
40 leastCommonP (letter0, count0) letter count
41 | count < count0 = (letter, count)
42 | otherwise = (letter0, count0)