aboutsummaryrefslogtreecommitdiff
path: root/aoc-2022-dotnet/Day21
diff options
context:
space:
mode:
authorTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2022-12-28 19:32:40 +0100
committerTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2022-12-28 19:32:40 +0100
commit8e71f049f5ffce904fcd477dbb019e794391c595 (patch)
tree15fbd4238cc1677dd08fd6fe3e6f29bbcd8b55b8 /aoc-2022-dotnet/Day21
parent68381d1c8bdd3d74f0924a47cf72809e40b34708 (diff)
downloadgleam_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.fs52
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