Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import qualified Text.ParserCombinators.ReadP as PC
- import Control.Monad
- import Data.Char
- import Data.Maybe
- import Data.List
- main = do
- input <- readFile "input3.txt"
- let tokens = fst . head . PC.readP_to_S allTokenP $ input
- print (sum . fmap tokenValue $ tokens)
- print (sumEnabled $ tokens)
- sumEnabled = fst . foldl' (\(sum, enabled) token -> (sum + if enabled then tokenValue token else 0, tokenEnabling token enabled)) (0, True)
- data Token = Value Int | Do | Dont deriving (Eq, Show, Ord)
- tokenValue (Value n) = n
- tokenValue _ = 0
- tokenEnabling Dont _ = False
- tokenEnabling Do _ = True
- tokenEnabling _ enabled = enabled
- mulP = do
- void $ PC.string "mul("
- n1 <- read <$> PC.many1 (PC.satisfy isDigit)
- void $ PC.char ','
- n2 <- read <$> PC.many1 (PC.satisfy isDigit)
- void $ PC.char ')'
- return $ Value (n1 * n2)
- doP = PC.string "do()" *> return Do
- dontP = PC.string "don't()" *> return Dont
- tokenP = PC.choice [mulP, doP, dontP]
- allTokenP = do
- maybeTokens <- PC.many1 ((return <$> tokenP) PC.<++ (PC.get *> return Nothing))
- PC.eof
- return $ catMaybes maybeTokens
Add Comment
Please, Sign In to add comment