Guest User

day3.hs

a guest
Dec 3rd, 2024
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. import qualified Text.ParserCombinators.ReadP as PC
  2. import Control.Monad
  3. import Data.Char
  4. import Data.Maybe
  5. import Data.List
  6.  
  7. main = do
  8. input <- readFile "input3.txt"
  9. let tokens = fst . head . PC.readP_to_S allTokenP $ input
  10. print (sum . fmap tokenValue $ tokens)
  11. print (sumEnabled $ tokens)
  12.  
  13. sumEnabled = fst . foldl' (\(sum, enabled) token -> (sum + if enabled then tokenValue token else 0, tokenEnabling token enabled)) (0, True)
  14.  
  15. data Token = Value Int | Do | Dont deriving (Eq, Show, Ord)
  16.  
  17. tokenValue (Value n) = n
  18. tokenValue _ = 0
  19.  
  20. tokenEnabling Dont _ = False
  21. tokenEnabling Do _ = True
  22. tokenEnabling _ enabled = enabled
  23.  
  24. mulP = do
  25. void $ PC.string "mul("
  26. n1 <- read <$> PC.many1 (PC.satisfy isDigit)
  27. void $ PC.char ','
  28. n2 <- read <$> PC.many1 (PC.satisfy isDigit)
  29. void $ PC.char ')'
  30. return $ Value (n1 * n2)
  31. doP = PC.string "do()" *> return Do
  32. dontP = PC.string "don't()" *> return Dont
  33. tokenP = PC.choice [mulP, doP, dontP]
  34.  
  35. allTokenP = do
  36. maybeTokens <- PC.many1 ((return <$> tokenP) PC.<++ (PC.get *> return Nothing))
  37. PC.eof
  38. return $ catMaybes maybeTokens
Add Comment
Please, Sign In to add comment