from dataclasses import dataclass from functools import reduce import re from .aoc import Aoc2, AocSameImplementation @dataclass class Race: time: int distance: int class Day06(AocSameImplementation[list[Race]], Aoc2[list[Race], list[Race]]): def simulate(self, timeaccel: int, timeoverall: int) -> int: racetime = timeoverall - timeaccel return racetime * timeaccel def parseinput2(self, inpt: str) -> list[Race]: lines = inpt.splitlines() times = int("".join(re.findall(r"\d+", lines[0]))) distances = int("".join(re.findall(r"\d+", lines[1]))) return [Race(times, distances)] def parseinput1(self, inpt: str) -> list[Race]: lines = inpt.splitlines() times = (int(d) for d in re.findall(r"\d+", lines[0])) distances = (int(d) for d in re.findall(r"\d+", lines[1])) return [Race(*t) for t in zip(times, distances)] def part(self, inpt: list[Race]) -> int: return reduce( lambda x, y: x * y, [ len( [ poss for poss in range(race.time) if self.simulate(poss, race.time) > race.distance ] ) for race in inpt ], ) def main() -> None: day06 = Day06(2023, 6) day06.run() if __name__ == "__main__": main()