Last active
December 7, 2023 16:58
-
-
Save Szer/98bef3ec3d321cc5a3634c8489155211 to your computer and use it in GitHub Desktop.
Advent of Code 2023 6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
let input = """Time: 7 15 30 | |
Distance: 9 40 200""" |> (fun s -> s.Split('\n', StringSplitOptions.RemoveEmptyEntries)) | |
type Race = | |
{ time : int64 | |
distance : int64 } | |
let splitInts (s: string) = s.Split([|' '|], StringSplitOptions.RemoveEmptyEntries) |> Array.map int | |
let parseRaces (input: string array) = | |
let times = input[0].Substring(6) |> splitInts | |
let distances = input.[1].Substring(9) |> splitInts | |
Array.zip times distances |> Array.map (fun (t, d) -> { time = t; distance = d }) | |
let parseRace (input: string array) = | |
let time = | |
input[0].Substring(6) | |
|> fun x -> x.Split([|' '|], StringSplitOptions.RemoveEmptyEntries) | |
|> String.Concat | |
|> int64 | |
let distances = | |
input.[1].Substring(9) | |
|> fun x -> x.Split([|' '|], StringSplitOptions.RemoveEmptyEntries) | |
|> String.Concat | |
|> int64 | |
{ time = time | |
distance = distances } | |
let amountOfWinCombos race = | |
let T = race.time | |
let D = race.distance | |
// amount of win combos are actually all integers values of X which satisfy the following equation: | |
// x^2 - T * x + D < 0 | |
// where T - time, D - distance | |
let sqrtDiscriminant = T * T - 4L * D |> float |> sqrt | |
let x1 = (float T + sqrtDiscriminant) / 2. | |
let x2 = (float T - sqrtDiscriminant) / 2. | |
// we need to exclude roots of the equation, and floor/ceil won't work if roots of the equation are integers | |
let x1Floor = | |
if x1 = int x1 then int64 x1 - 1L | |
else floor x1 |> int64 | |
let x2Ceil = | |
if x2 = int x2 then int64 x2 + 1L | |
else ceil x2 |> int64 | |
x1Floor - x2Ceil + 1L | |
let part1 = | |
parseRaces input | |
|> Seq.map amountOfWinCombos | |
|> Seq.reduce (*) // 288 | |
let part2 = | |
parseRace input | |
|> amountOfWinCombos // 71503 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment