69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
![]() |
import sys
|
||
|
sys.path.append('../lib')
|
||
|
|
||
|
import tools
|
||
|
|
||
|
class Race(object):
|
||
|
def __init__(self, duration, distance):
|
||
|
self.duration = duration
|
||
|
self.distance = distance
|
||
|
|
||
|
def __str__(self):
|
||
|
return f'Time: {self.duration}, Distance: {self.distance}'
|
||
|
|
||
|
def calc_winning_strategies(self) -> list:
|
||
|
winning_press_durations = []
|
||
|
for dur in range(1, self.duration):
|
||
|
if ((self.duration - dur) * dur) > self.distance:
|
||
|
winning_press_durations.append(dur)
|
||
|
return winning_press_durations
|
||
|
|
||
|
|
||
|
class RaceSet(object):
|
||
|
def __init__(self, inp, join_input=False):
|
||
|
if join_input:
|
||
|
times = [int(''.join([n for n in inp[0].split(':')[1].split()]))]
|
||
|
distances = [int(''.join([n for n in inp[1].split(':')[1].split()]))]
|
||
|
else:
|
||
|
times = [int(n) for n in inp[0].split(':')[1].split()]
|
||
|
distances = [int(n) for n in inp[1].split(':')[1].split()]
|
||
|
assert len(times) == len(distances)
|
||
|
|
||
|
self.races = []
|
||
|
for i in range(len(times)):
|
||
|
r = Race(times[i], distances[i])
|
||
|
self.races.append(r)
|
||
|
|
||
|
def __str__(self):
|
||
|
out = f'Set of {len(self.races)} races:\n'
|
||
|
out += "\n".join([str(r) for r in self.races])
|
||
|
return out
|
||
|
|
||
|
def calc_product_of_winning_strategies(self) -> int:
|
||
|
product = 1
|
||
|
for r in self.races:
|
||
|
strategies = r.calc_winning_strategies()
|
||
|
product *= len(strategies)
|
||
|
return product
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
r = tools.Reader('input.txt')
|
||
|
lines = r.read()
|
||
|
|
||
|
races = RaceSet(lines)
|
||
|
print(races)
|
||
|
|
||
|
x = races.calc_product_of_winning_strategies()
|
||
|
print(x)
|
||
|
|
||
|
races = RaceSet(lines, join_input=True)
|
||
|
print(races)
|
||
|
|
||
|
x = races.calc_product_of_winning_strategies()
|
||
|
print(x)
|
||
|
|
||
|
|
||
|
|