{-# LANGUAGE LambdaCase #-} module Main where import Text.Regex.TDFA import Data.List.Split e :: [String] -> [(Int,Int)] e = ((\case [a,b] -> (read a, read b) err -> error $ "Parsing failed on: " ++ show err ) . splitWhen (== ',') . init . drop 4 <$>) parse1 :: String -> [(Int,Int)] parse1 = e . getAllTextMatches . (=~ "mul\\([[:digit:]]+,[[:digit:]]+\\)") parse2 :: String -> [(Int,Int)] parse2 = let h [] = [] h a = let (t,t') = span (/= "don't()") a in t ++ g t' g [] = [] g a = h . dropWhile (== "do()") $ dropWhile (/= "do()") a in e . filter (/= "do()") . h . getAllTextMatches . (=~ "mul\\([[:digit:]]+,[[:digit:]]+\\)|do\\(\\)|don't\\(\\)") solve :: [(Int,Int)] -> Int solve = foldr ((+) . uncurry (*)) 0 main :: IO () main = readFile "inputs/3" >>= \i -> print (solve $ parse1 i) >> print (solve $ parse2 i)