X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent04%2Fadvent04.hs;fp=src%2Fadvent04%2Fadvent04.hs;h=b8ae85c8a46f885b993184c43ecc25676446ce44;hb=44f12be1a7004e39cb6e4064a335bcecf7cc728a;hp=0000000000000000000000000000000000000000;hpb=56a472b8d4126a5f146a655662d867d5c32a783a;p=advent-of-code-17.git diff --git a/src/advent04/advent04.hs b/src/advent04/advent04.hs new file mode 100644 index 0000000..b8ae85c --- /dev/null +++ b/src/advent04/advent04.hs @@ -0,0 +1,28 @@ +import Data.List (sort) +import Data.List.Split (splitOn) +import qualified Data.Map.Strict as M + +main :: IO () +main = do + text <- readFile "data/advent04.txt" + let passphrases = map parseLine $ lines text + print $ part1 passphrases + print $ part2 passphrases + +part1 :: [[String]] -> Int +part1 = length . filter (not . containsDuplicates) + +part2 :: [[String]] -> Int +part2 = length . filter (not . containsAnagrams) + +parseLine :: String -> [String] +parseLine = filter (not . null) . splitOn " " + +frequency :: (Ord a) => [a] -> M.Map a Int +frequency xs = M.fromListWith (+) [(x, 1) | x <- xs] + +containsDuplicates :: [String] -> Bool +containsDuplicates = (not . M.null) . M.filter (> 1) . frequency + +containsAnagrams :: [String] -> Bool +containsAnagrams = containsDuplicates . (map sort)