b8ae85c8a46f885b993184c43ecc25676446ce44
[advent-of-code-17.git] / src / advent04 / advent04.hs
1 import Data.List (sort)
2 import Data.List.Split (splitOn)
3 import qualified Data.Map.Strict as M
4
5 main :: IO ()
6 main = do
7 text <- readFile "data/advent04.txt"
8 let passphrases = map parseLine $ lines text
9 print $ part1 passphrases
10 print $ part2 passphrases
11
12 part1 :: [[String]] -> Int
13 part1 = length . filter (not . containsDuplicates)
14
15 part2 :: [[String]] -> Int
16 part2 = length . filter (not . containsAnagrams)
17
18 parseLine :: String -> [String]
19 parseLine = filter (not . null) . splitOn " "
20
21 frequency :: (Ord a) => [a] -> M.Map a Int
22 frequency xs = M.fromListWith (+) [(x, 1) | x <- xs]
23
24 containsDuplicates :: [String] -> Bool
25 containsDuplicates = (not . M.null) . M.filter (> 1) . frequency
26
27 containsAnagrams :: [String] -> Bool
28 containsAnagrams = containsDuplicates . (map sort)