.
[aoc20.git] / 18 / one.icl
1 module one
2
3 import StdEnv
4 import Data.Either
5 import Data.Func
6 import Data.Functor
7 import Control.Applicative
8 import Control.Monad
9 import Text.Parsers.Simple.ParserCombinators
10
11 read :: *File -> [[Char]]
12 read f
13 # (l, f) = freadline f
14 | l.[size l - 1] <> '\n' = []
15 = [[c\\c<-:l | c <> '\n']:read f]
16
17 Start w
18 # (io, w) = stdio w
19 # ls = read io
20 = (one ls, two ls)
21
22 one = fmap sum o sequence o map (parse pExpr)
23 two = fmap sum o sequence o map (parse pExpr`)
24
25 pExpr :: Parser Char Int
26 pExpr = flip pChainl1 (pOp (+) '+' <|> pOp (*) '*') $ pInt <|> (pPOpen *> pExpr <* pPClose)
27
28 pExpr` :: Parser Char Int
29 pExpr`
30 = flip pChainl1 (pOp (*) '*')
31 $ flip pChainl1 (pOp (+) '+')
32 $ pInt <|> (pPOpen *> pExpr` <* pPClose)
33
34 pOp :: (Int Int -> Int) Char -> Parser Char (Int Int -> Int)
35 pOp op c = op <$ pSpace <* pToken c <* pSpace
36
37 pInt :: Parser Char Int
38 pInt = toInt o toString <$> some pDigit