import Data.List (nub, sort) main :: IO () main = do raw <- readFile "day6.txt" let ls = map concat $ split "" $ lines raw ms = split "" $ lines raw ansA = sum $ map (length . nub) ls ansB = sum $ map (length . (foldr match ['a'..'z'])) ms in do putStrLn $ "day6a: " ++ (show ansA) putStrLn $ "day6b: " ++ (show ansB) match :: (Ord a, Eq a) => [a] -> [a] -> [a] match as bs = (sort . nub) $ filter (`elem` bs) as split :: Eq a => a -> [a] -> [[a]] split _ [] = [] split v as = split' v as [] [] split' :: Eq a => a -> [a] -> [a] -> [[a]] -> [[a]] split' _ [] a as = as ++ [a] split' v (b:bs) a as | b == v = split' v bs [] (as ++ [a]) | otherwise = split' v bs (a ++ [b]) as