33 lines
1,009 B
Haskell
33 lines
1,009 B
Haskell
import Data.List
|
|
|
|
|
|
main :: IO ()
|
|
main = do
|
|
input <- readFile "input"
|
|
putStrLn . formatOutput . map (sum . map length) . transpose . groups . dlfsplit $ input
|
|
|
|
|
|
formatOutput :: Show a => [a] -> String
|
|
formatOutput (part1:part2:_) = "Part 1: " ++ show part1 ++ "\nPart 2: " ++ show part2
|
|
|
|
-- Collect each group's answers
|
|
groups :: [String] -> [[String]]
|
|
groups [] = []
|
|
groups (g:gs) = [foldr1 union g', foldr1 intersect g'] : groups gs
|
|
where g' = lines g
|
|
|
|
-- Split a string into a list across all the double newlines in it
|
|
dlfsplit :: String -> [String]
|
|
dlfsplit str = a : case b of
|
|
[] -> []
|
|
b -> dlfsplit b
|
|
where (a,b) = dlfsplitonce str
|
|
|
|
-- Split a string into two across the first double newline found
|
|
dlfsplitonce :: String -> (String, String)
|
|
dlfsplitonce [] = ([], [])
|
|
dlfsplitonce (ca:cb:rest)
|
|
| ca == '\n' && cb == '\n' = ([], rest)
|
|
| otherwise = (ca:before, after)
|
|
where (before, after) = dlfsplitonce (cb : rest)
|
|
dlfsplitonce c = (c, [])
|