45 lines
1.1 KiB
Haskell
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
|