advent-of-code/hs/src/Aoc/Y2020/D18.hs
2020-12-19 15:59:10 +00:00

45 lines
1.1 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Aoc.Y2020.D18
( day
) where
import Control.Monad
import Control.Monad.Combinators.Expr
import qualified Data.Text as T
import qualified Text.Megaparsec.Char.Lexer as L
import Aoc.Day
import Aoc.Parse
lexeme :: Parser a -> Parser a
lexeme = L.lexeme (void lineSpace)
symbol :: T.Text -> Parser T.Text
symbol = L.symbol (void lineSpace)
parser :: [[Operator Parser Int]] -> Parser [Int]
parser table = manyLines expr
where
parens = between (symbol "(") (symbol ")")
term = lexeme L.decimal <|> parens expr
expr = makeExprParser term table
table1 :: [[Operator Parser Int]]
table1 = [[InfixL ((+) <$ symbol "+"), InfixL ((*) <$ symbol "*")]]
table2 :: [[Operator Parser Int]]
table2 = [[InfixL ((+) <$ symbol "+")], [InfixL ((*) <$ symbol "*")]]
solver :: FilePath -> T.Text -> IO ()
solver path text = do
putStrLn ">> Part 1"
parseAndSolve path text (parser table1) $ print . sum
putStrLn ""
putStrLn ">> Part 2"
parseAndSolve path text (parser table2) $ print . sum
day :: Day
day = dayText solver