2023 Day 6 Part 1
This commit is contained in:
parent
70b145286b
commit
7622e09f8c
1 changed files with 60 additions and 0 deletions
60
2023/day06.nim
Normal file
60
2023/day06.nim
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
import std/enumerate
|
||||||
|
import std/math
|
||||||
|
import std/sequtils
|
||||||
|
import std/sets
|
||||||
|
import std/strscans
|
||||||
|
import std/strutils
|
||||||
|
import std/sugar
|
||||||
|
import std/tables
|
||||||
|
|
||||||
|
type Race = tuple
|
||||||
|
time: int
|
||||||
|
distance: int
|
||||||
|
|
||||||
|
func parseRaces(text: string): seq[Race] =
|
||||||
|
let lines = text.strip.splitLines
|
||||||
|
let times = lines[0].splitWhitespace
|
||||||
|
let distances = lines[1].splitWhitespace
|
||||||
|
assert(times[0] == "Time:")
|
||||||
|
assert(distances[0] == "Distance:")
|
||||||
|
|
||||||
|
for (time, distance) in zip(times[1..^1], distances[1..^1]):
|
||||||
|
result.add (time.parseInt, distance.parseInt)
|
||||||
|
|
||||||
|
func distance_traveled(race: Race, hold_ms: int): int =
|
||||||
|
let travel_time = max(0, race.time - hold_ms)
|
||||||
|
let speed = hold_ms
|
||||||
|
speed * travel_time
|
||||||
|
|
||||||
|
func min_win(race: Race): int =
|
||||||
|
var hold_ms = 0
|
||||||
|
while hold_ms < race.time:
|
||||||
|
let dist = race.distance_traveled(hold_ms)
|
||||||
|
if dist > race.distance:
|
||||||
|
return hold_ms
|
||||||
|
inc hold_ms
|
||||||
|
|
||||||
|
func max_win(race: Race): int =
|
||||||
|
var hold_ms = race.time - 1
|
||||||
|
while hold_ms > 0:
|
||||||
|
let dist = race.distance_traveled(hold_ms)
|
||||||
|
if dist > race.distance:
|
||||||
|
return hold_ms
|
||||||
|
dec hold_ms
|
||||||
|
|
||||||
|
func win_count(race: Race): int =
|
||||||
|
let min_ms = race.min_win
|
||||||
|
let max_ms = race.max_win
|
||||||
|
len(min_ms .. max_ms)
|
||||||
|
|
||||||
|
proc dbg[T](v: T): T = (echo(v); v)
|
||||||
|
|
||||||
|
proc part1(): int =
|
||||||
|
let text = readFile("input/day06.txt")
|
||||||
|
let races = parseRaces(text)
|
||||||
|
|
||||||
|
result = 1
|
||||||
|
for race in races:
|
||||||
|
result *= dbg(race.win_count)
|
||||||
|
|
||||||
|
echo part1()
|
||||||
Loading…
Reference in a new issue