-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday18_part02.fs
31 lines (23 loc) · 1005 Bytes
/
day18_part02.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
module day18_part02
open AdventOfCode_2020.Modules
open FParsec
// parsers
let parseDecimal : Parser<decimal, unit> = puint64 |>> decimal
let strWs s = pstring s >>. spaces
let parseTerm expression = (parseDecimal .>> spaces) <|> between (strWs "(") (strWs ")") expression
let runParser expr str =
match run expr str with
| Success (result, _, _) -> result
| Failure (errorMsg, _, _) -> failwithf "Error from parser: %s" errorMsg
let runPart addOperator input =
let opp = OperatorPrecedenceParser<decimal, unit, unit>()
let expression = opp.ExpressionParser
let multOperator = InfixOperator ("*", spaces, 1, Associativity.Left, (*))
opp.TermParser <- parseTerm expression
opp.AddOperator(addOperator)
opp.AddOperator(multOperator)
input |> Array.sumBy (runParser expression)
let execute =
let path = "day18/day18_input.txt"
let operations = LocalHelper.GetLinesFromFile path
runPart (InfixOperator ("+", spaces, 2, Associativity.Left, (+))) operations