Day 9 - alternate solution using only one foldl pass

This commit is contained in:
Jonathan Chan 2017-12-08 22:51:36 -08:00
parent 512d3d1e8d
commit 732092abe3
1 changed files with 16 additions and 0 deletions

16
9_alt.hs Normal file
View File

@ -0,0 +1,16 @@
scoreAndCount :: String -> (Int, Int)
scoreAndCount str =
let (_, _, _, score, count) = foldl f (False, False, 1, 0, 0) str
in (score, count)
where f (isCancel, isGarbage, level, score, count) curr
| isCancel = (False, isGarbage, level, score, count)
| isGarbage = (curr == '!', curr /= '>', level, score, count + (fromEnum $ curr /= '>' && curr /= '!'))
| curr == '{' = (False, False, level + 1, score + level, count)
| curr == '}' = (False, False, level - 1, score, count)
| curr == ',' = (False, False, level, score, count)
| curr == '<' = (False, True, level, score, count)
main :: IO ()
main = do
input <- readFile "9.txt"
print $ scoreAndCount input