- afterChunk = take 1 $ drop n springs
-
-
--- countViable previousSprings (Record (s:springs) (g:signature)) =
-
-
--- count: either consume this group or not
-
-
--- cache is how many ways to assign unknowns, leaving this partial record.
--- first item of springs is unknown or damaged
--- count = count_consuming_group + count_leaving_group
--- if first spring is damaged: count = count_consuming_group
-
-
-
--- if first spring is damaged and next few springs can match next group:
--- consume springs (including all following operational ones), consume group
--- Add to cache: record' -> cache ! original
--- return countViable record'
--- if first spring is unknown
--- assume it's damaged, consume springs, consume group
-
-
-
-
-
--- countViable (springs after group) (tail groups) + countViable (tail springs) groups
--- else
--- countViable (tail springs) groups
-
-
-
-countViableAssignments :: Record -> Int
-countViableAssignments = length . filter matchesSignature . possibleAssignments
-
-matchesSignature :: Record -> Bool
-matchesSignature (Record springs signature) = signSprings springs == signature
-
-signSprings :: [Spring] -> [Int]
-signSprings = fmap (length) . filter ((== Damaged) . head) . group
-
-choose :: Int -> [a] -> [[a]]
-choose 0 _ = [[]]
-choose n (x:xs)
- | length xs == n - 1 = [(x:xs)]
- | otherwise = (fmap (x:) (choose (n-1) xs)) ++ (choose n xs)
-
--- unknownIndices :: [Spring] -> [Int]
--- unknownIndices = elemIndices Unknown
-
-numDamagedToPlace :: Record -> Int
-numDamagedToPlace (Record springs signature) = totalDamaged - knownDamaged
- where knownDamaged = length $ filter (== Damaged) springs
- totalDamaged = sum signature
-
-candidates :: Record -> [[Int]]
-candidates r@(Record springs _) =
- choose (numDamagedToPlace r) (elemIndices Unknown springs)
-
-replaceUnknowns :: [Spring] -> [Int] -> [Spring]
-replaceUnknowns springs indices = foldr go [] indexedSprings
- where indexedSprings = zip [0..] springs
- go (i, Unknown) acc = if (i `elem` indices) then Damaged:acc
- else Operational:acc
- go (_, s) acc = s:acc
-
-possibleAssignments :: Record -> [Record]
-possibleAssignments r@(Record springs signature) =
- fmap (\p -> Record p signature) possibles
- where cands = candidates r
- possibles = fmap (replaceUnknowns springs) cands
-