50 lines
1.5 KiB
Python
Executable file
50 lines
1.5 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
import sys
|
|
from typing import NamedTuple
|
|
|
|
|
|
class RunPerformance(NamedTuple):
|
|
speed: int
|
|
time: int
|
|
rest: int
|
|
|
|
def run(self, t: int) -> int:
|
|
cycle_length = self.time + self.rest
|
|
cycles = t // cycle_length
|
|
left_over = t % cycle_length
|
|
run_time = cycles * self.time + min(self.time, left_over)
|
|
return self.speed * run_time
|
|
|
|
|
|
def solve(input: str) -> int:
|
|
def parse_line(input: str) -> tuple[str, RunPerformance]:
|
|
split_input = input.split()
|
|
speed, time, rest = map(int, (split_input[3], split_input[6], split_input[-2]))
|
|
return split_input[0], RunPerformance(speed, time, rest)
|
|
|
|
def parse(input: str) -> dict[str, RunPerformance]:
|
|
return {name: perf for name, perf in map(parse_line, input.splitlines())}
|
|
|
|
def race(reindeers: dict[str, RunPerformance], t: int) -> dict[str, int]:
|
|
points = {name: 0 for name in reindeers.keys()}
|
|
for i in range(1, t + 1):
|
|
# Just re-compute the run every time, it's fast enough
|
|
distances = {name: perf.run(i) for name, perf in reindeers.items()}
|
|
max_dist = max(distances.values())
|
|
for name, distance in distances.items():
|
|
points[name] += distance == max_dist
|
|
return points
|
|
|
|
reindeers = parse(input)
|
|
scores = race(reindeers, 2503)
|
|
return max(scores.values())
|
|
|
|
|
|
def main() -> None:
|
|
input = sys.stdin.read()
|
|
print(solve(input))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|