summary refs log tree commit diff
path: root/src/Day3.idr
diff options
context:
space:
mode:
Diffstat (limited to 'src/Day3.idr')
-rw-r--r--src/Day3.idr40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/Day3.idr b/src/Day3.idr
new file mode 100644
index 0000000..5f14827
--- /dev/null
+++ b/src/Day3.idr
@@ -0,0 +1,40 @@
+module Day3 
+
+import Data.String.Parser
+import Data.String
+
+mul : Parser Integer
+mul = (*) <$ string "mul(" <*> integer <* string "," <*> integer <* string ")"
+
+
+partParser : Parser a -> String -> List a
+partParser p str = case str of
+                 "" => []
+                 _ => case parse p str of
+                           Left _ => partParser p (strSubstr 1 (strLength str) str)
+                           Right (num, bla) => num :: (partParser p (strSubstr bla (strLength str) str))
+
+part1 : String -> List Integer
+part1 = partParser mul
+
+export sol1 : String -> String
+sol1 = show . sum . part1
+
+dont : Parser (Either Bool Integer)
+dont = Left <$> ((True <$ string "do()") <|> (False <$ string "don't()"))
+
+mul2 : Parser (Either Bool Integer)
+mul2 = (Right <$> mul) <|> dont
+
+part2 : String -> List (Either Bool Integer)
+part2 = partParser mul2
+
+toggleSum : Bool -> List (Either Bool Integer) -> Integer
+toggleSum x [] = 0
+toggleSum x ((Left y) :: xs) = toggleSum y xs
+toggleSum False ((Right y) :: xs) = toggleSum False xs
+toggleSum True ((Right y) :: xs) = y + (toggleSum True xs)
+
+export
+sol2 : String -> String
+sol2 = show . toggleSum True . part2