56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
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()
|