This repository has been archived by the owner on Nov 22, 2024. It is now read-only.
generated from mazharenko/aoc-agent-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday02.fs
74 lines (64 loc) · 2.11 KB
/
day02.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
module impl.day02
open Farkle
open Farkle.Builder
open Farkle.Builder.Regex
type CubeSet =
{ Red: int; Green: int; Blue: int }
type CubeSets = CubeSet[]
type Game = { Id : int; Cubes : CubeSets }
let private color =
chars Letter
|> atLeast 1
|> terminal "Color" (T(fun _ x -> x.ToString()))
let private number = Terminals.int "Number"
let private cubeCount = number
// 5 red, 6 blue; 5 red, 6 blue
let private cubeSets = (
sepBy1 (literal ";")
// 5 red, 6 blue
("CubeSet" ||= [
!@ (sepBy1 (literal ",") (
// 5 red
// 6 blue
"OneColorCubes" ||= [
!@ cubeCount .>>. color => (fun n c -> (c, n))
])) => (
Map.ofList >>
fun map -> {
Red = map |> Map.tryFind "red" |> Option.defaultValue 0
Blue = map |> Map.tryFind "blue" |> Option.defaultValue 0
Green = map |> Map.tryFind "green" |> Option.defaultValue 0
}
)
])
)
// Game1: 5 red, 6 blue; 5 red, 6 blue
let private game = "Game" ||= [
!& "Game" .>>. number .>> ":" .>>. cubeSets
=> fun id sets -> { Id = id; Cubes = sets |> List.toArray }
]
let parse input =
let parser = RuntimeFarkle.build game
input
|> Pattern1.read (RuntimeFarkle.parseUnsafe parser)
let solve1 =
fun input ->
let limit = {Red = 12; Green = 13; Blue = 14 }
input
|> Array.filter (
fun game ->
game.Cubes |> Array.forall (fun set -> set.Red <= limit.Red && set.Green <= limit.Green && set.Blue <= limit.Blue)
)
|> Array.sumBy _.Id
let solve2 =
fun input ->
input
|> Array.map (
fun game ->
{
Red = game.Cubes |> Seq.map _.Red |> Seq.max
Green = game.Cubes |> Seq.map _.Green |> Seq.max
Blue = game.Cubes |> Seq.map _.Blue |> Seq.max
}
) |> Array.map (fun set -> set.Red * set.Green * set.Blue)
|> Array.sum