import Control.Applicative (liftA2) import Data.List (group) import Data.List.Split (splitOn) getConsecutives :: String -> [Int] getConsecutives = map length . filter ((== '#') . head) . group allSprings :: String -> [String] allSprings = foldr (liftA2 (:) . getChars) [""] where getChars c = if c == '?' then ['.', '#'] else [c] solve :: [Int] -> String -> Int solve records = length . filter ((== records) . getConsecutives) . allSprings parseLine :: String -> ([Int], String) parseLine l = (map read . splitOn "," $ y, x) where (x:y:_) = splitOn " " l main :: IO () main = print . sum . map (uncurry solve . parseLine) . lines =<< readFile "data.txt"