-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_2.fsx
61 lines (49 loc) · 1.72 KB
/
day_2.fsx
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
#load "common.fsx"
open System.IO
open System.Text.RegularExpressions
type Game = { id: int; red: int; green: int; blue: int }
let idRegex = "Game (\d+):"
let redRegex = "(\d+) red"
let greenRegex = "(\d+) green"
let blueRegex = "(\d+) blue"
let extractMaxValue line regex =
Regex.Matches(line, regex)
|> Seq.map (fun x -> x.Groups[1].Value |> int)
|> Seq.max
let parseGame (line: string): Game =
let id = Regex.Match(line, idRegex).Groups[1].Value |> int
let red = extractMaxValue line redRegex
let green = extractMaxValue line greenRegex
let blue = extractMaxValue line blueRegex
{ id = id; red = red; green = green; blue = blue}
let readInput () = Input.readAllLines "input_2.txt"
let isGamePossible (game: Game) red green blue =
let isPossible = game.red <= red && game.green <= green && game.blue <= blue
isPossible
// if isPossible then
// printfn $"Game {game.id} is possible because totalRed = {game.red} <= {red}, totalGreen = {game.green} <= {green}, totalBlue = {game.blue} <= {blue}"
// true
// else
// printfn $"Game {game.id} is not possible because totalRed = {game.red}, totalGreen = {game.green}, totalBlue = {game.blue}"
// false
let allGames =
readInput()
|> Array.map parseGame
let possibleGames =
allGames
|> Array.filter (fun game -> isGamePossible game 12 13 14)
// Part 1
let part1 =
possibleGames
|> Array.sumBy _.id
printfn $"Part1: {part1}"
// Part 2
let computePowerOfGame (game: Game) =
let power = game.red * game.green * game.blue
//printfn "Power of game %A is %d" game power
power
let part2 =
allGames
|> Array.map computePowerOfGame
|> Array.sum
printfn $"Part2: {part2}"