diff options
author | Tomasz Chojnacki <tomaszchojnacki2001@gmail.com> | 2022-12-28 19:32:40 +0100 |
---|---|---|
committer | Tomasz Chojnacki <tomaszchojnacki2001@gmail.com> | 2022-12-28 19:32:40 +0100 |
commit | 8e71f049f5ffce904fcd477dbb019e794391c595 (patch) | |
tree | 15fbd4238cc1677dd08fd6fe3e6f29bbcd8b55b8 /aoc-2022-dotnet/Day21 | |
parent | 68381d1c8bdd3d74f0924a47cf72809e40b34708 (diff) | |
download | gleam_aoc2020-8e71f049f5ffce904fcd477dbb019e794391c595.tar.gz gleam_aoc2020-8e71f049f5ffce904fcd477dbb019e794391c595.zip |
Finish part 1 of day 21
Diffstat (limited to 'aoc-2022-dotnet/Day21')
-rw-r--r-- | aoc-2022-dotnet/Day21/Program.fs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/aoc-2022-dotnet/Day21/Program.fs b/aoc-2022-dotnet/Day21/Program.fs index e5d8920..3837054 100644 --- a/aoc-2022-dotnet/Day21/Program.fs +++ b/aoc-2022-dotnet/Day21/Program.fs @@ -1,9 +1,61 @@ module Day21 open System.IO +open FSharpPlus open FParsec open Common +type MonkeyName = string +type Operator = int64 -> int64 -> int64 + +type MonkeyJob = + | Number of int64 + | Operation of MonkeyName * Operator * MonkeyName + + static member dependencies = + function + | Number _ -> [] + | Operation (l, _, r) -> [ l; r ] + +type Monkey = MonkeyName * MonkeyJob + +let charToOperator = + function + | '+' -> (+) + | '-' -> (-) + | '*' -> (*) + | '/' -> (/) + | c -> failwithf "Invalid operator: %c" c + +let parseMonkey = + let pspc = pchar ' ' + let pname = anyString 4 |>> MonkeyName + let poper = pspc >>. anyChar .>> pspc |>> charToOperator + let pnumber = pint64 |>> Number + let poperation = tuple3 pname poper pname |>> Operation + let pjob = pnumber <|> poperation + let pmonkey = pname .>> pstring ": " .>>. pjob |>> Monkey + Util.parse pmonkey + +let solution input = + let monkeys = input |> Seq.map parseMonkey |> Map.ofSeq + + monkeys + |> Map.mapValues MonkeyJob.dependencies + |> Util.tsort + |> List.fold + (fun values name -> + Map.add + name + (match monkeys[name] with + | Number num -> num + | Operation (left, operator, right) -> operator values[left] values[right]) + values) + Map.empty + |> Map.find "root" + let test = File.ReadLines("test.txt") +assert (solution test = 152) let input = File.ReadLines("input.txt") +printfn "%d" <| solution input |