From ea5b2dfdfc91b518f6073c4f016372267cf5e632 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 21 May 2025 04:05:45 +0100 Subject: [PATCH] 2015: d14: ex2: add solution --- 2015/d14/ex2/ex2.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 2015/d14/ex2/ex2.py diff --git a/2015/d14/ex2/ex2.py b/2015/d14/ex2/ex2.py new file mode 100755 index 0000000..dbdd34f --- /dev/null +++ b/2015/d14/ex2/ex2.py @@ -0,0 +1,50 @@ +#!/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()