|
|
@@ -0,0 +1,45 @@ |
|
|
|
from functools import reduce |
|
|
|
|
|
|
|
from helpers import Helper |
|
|
|
|
|
|
|
helper = Helper(debug=True) |
|
|
|
debug = helper.debug |
|
|
|
load_input = helper.load_input |
|
|
|
|
|
|
|
def main(): |
|
|
|
lines = load_input(6) |
|
|
|
|
|
|
|
races = [] |
|
|
|
|
|
|
|
times = [] |
|
|
|
distances = [] |
|
|
|
for line in lines: |
|
|
|
header, values_str = line.split(":") |
|
|
|
for value in values_str.split(): |
|
|
|
if header == "Time": |
|
|
|
times.append(int(value)) |
|
|
|
else: |
|
|
|
distances.append(int(value)) |
|
|
|
|
|
|
|
for item in zip(times, distances): |
|
|
|
races.append({"Time": item[0], "Distance": item[1]}) |
|
|
|
|
|
|
|
# debug(races) |
|
|
|
|
|
|
|
ways_to_win = [] |
|
|
|
for i, race in enumerate(races): |
|
|
|
win_ways = 0 |
|
|
|
for held_time in range(race["Time"]): |
|
|
|
run_time = race["Time"] - held_time |
|
|
|
run_distance = run_time * held_time |
|
|
|
if run_distance > race["Distance"]: |
|
|
|
debug(f"I can win race {i} with time {held_time}ms (it'll run {run_time}ms at {held_time}mm/ms for {run_distance}mm total.)") |
|
|
|
win_ways += 1 |
|
|
|
ways_to_win.append(win_ways) |
|
|
|
|
|
|
|
total_ways_to_win = reduce(lambda x,y: x*y, ways_to_win) |
|
|
|
|
|
|
|
print(f"Total ways to win all races: {total_ways_to_win} ({'*'.join([str(i) for i in ways_to_win])})") |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
main() |