]>
| Commit | Line | Data |
|---|---|---|
| 1 | import qualified Data.Map as M | |
| 2 | ||
| 3 | main :: IO () | |
| 4 | main = do | |
| 5 | input <- getContents | |
| 6 | let ids = lines input | |
| 7 | let count_twos = countN 2 ids | |
| 8 | let count_threes = countN 3 ids | |
| 9 | print (count_twos * count_threes) | |
| 10 | putStrLn . abc $ ids | |
| 11 | ||
| 12 | countN :: Int -> [String] -> Int | |
| 13 | countN check_count = sum . map (go check_count) | |
| 14 | where go :: Int -> String -> Int | |
| 15 | go cc test = if any (== cc) . M.elems . countChar $ test | |
| 16 | then 1 | |
| 17 | else 0 | |
| 18 | ||
| 19 | countChar :: String -> M.Map Char Int | |
| 20 | countChar = foldl go M.empty | |
| 21 | where go :: M.Map Char Int -> Char -> M.Map Char Int | |
| 22 | go chmap char = M.insert char ((M.findWithDefault 0 char chmap) + 1) chmap | |
| 23 | ||
| 24 | abc :: [String] -> String | |
| 25 | abc (i:is) | |
| 26 | | null test = abc is | |
| 27 | | otherwise = head test | |
| 28 | where cor_len = (length i) - 1 | |
| 29 | test = filter (\s -> (length s) == cor_len) . map (diff i) $ is | |
| 30 | ||
| 31 | diff :: Eq a => [a] -> [a] -> [a] | |
| 32 | diff [] [] = [] | |
| 33 | diff (a:as) (b:bs) | |
| 34 | | a == b = (a : diff as bs) | |
| 35 | | otherwise = diff as bs |