26 lines
775 B
Haskell
26 lines
775 B
Haskell
import Data.List.Split (splitOn)
|
|
import Data.List (group)
|
|
import Control.Applicative (Applicative(liftA2))
|
|
import Data.Bool (bool)
|
|
|
|
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 :: (String, [Int]) -> Int
|
|
solve (springs, records) = length . filter (matchesConsecutive records) . allSprings $ springs
|
|
|
|
parseLine :: String -> (String, [Int])
|
|
parseLine l = (x, map read . splitOn "," $ y)
|
|
where
|
|
(x:y:_) = splitOn " " l
|
|
|
|
main :: IO ()
|
|
main = print . sum . map (solve . parseLine) . filter (not . null) . lines =<< readFile "data.txt"
|