import Data.List.Split (splitOn) import Data.List (group) import Control.Applicative (liftA2) matchesConsecutive :: [Int] -> String -> Bool matchesConsecutive xs = (==) xs . map length . filter ((==) '#' . head) . group getChars :: Char -> [Char] getChars '?' = ['.', '#'] getChars c = [c] allSprings :: String -> [String] allSprings = foldr (liftA2 (:) . getChars) [""] solve :: [Int] -> String -> Int solve records = length . filter (matchesConsecutive records) . 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"