78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
def parse_input(file_path):
|
|
"""Parse the input file into race times and record distances."""
|
|
with open(file_path, "r") as file:
|
|
lines = file.readlines()
|
|
times = [int(value) for value in lines[0].strip().split() if value.isdigit()]
|
|
distances = [
|
|
int(value) for value in lines[1].strip().split() if value.isdigit()
|
|
]
|
|
print(f"Input parsed. Times: {times}, Distances: {distances}")
|
|
return times, distances
|
|
|
|
|
|
def calculate_winning_ways(time, record):
|
|
"""Calculate the number of ways to beat the record for a single race."""
|
|
print(f"Calculating winning ways for time: {time}, record: {record}")
|
|
winning_ways = 0
|
|
# Check hold times from 0 up to (time - 1)
|
|
for hold_time in range(time):
|
|
speed = hold_time
|
|
remaining_time = time - hold_time
|
|
distance = speed * remaining_time
|
|
print(
|
|
f"Hold Time: {hold_time}, Speed: {speed}, Remaining Time: {remaining_time}, Distance: {distance}"
|
|
)
|
|
# Count as winning way if distance is greater than the record
|
|
if distance > record:
|
|
winning_ways += 1
|
|
print(f"Winning ways for this race: {winning_ways}")
|
|
return winning_ways
|
|
|
|
|
|
def total_winning_combinations(times, distances):
|
|
"""Calculate the total number of winning combinations for all races."""
|
|
print("Calculating total winning combinations.")
|
|
total_combinations = 1
|
|
for time, record in zip(times, distances):
|
|
winning_ways = calculate_winning_ways(time, record)
|
|
if winning_ways == 0:
|
|
print("No winning way for a race. Exiting.")
|
|
return 0 # Early exit if no winning way for a race
|
|
total_combinations *= winning_ways
|
|
print(f"Total winning combinations: {total_combinations}")
|
|
return total_combinations
|
|
|
|
|
|
def run_test(file_path):
|
|
"""Run the test with assertions to verify the functionality."""
|
|
print(f"Running test with file: {file_path}")
|
|
times, distances = parse_input(file_path)
|
|
result = total_winning_combinations(times, distances)
|
|
print(f"Test result: {result}")
|
|
assert result == 288, f"Test failed! Expected 288, got {result}"
|
|
print("Test passed successfully.")
|
|
|
|
|
|
def main():
|
|
"""Main function to run the test and then process the input file."""
|
|
try:
|
|
test_file_path = "../test.txt"
|
|
run_test(test_file_path)
|
|
|
|
input_file_path = "../input.txt"
|
|
print(f"\nProcessing input file: {input_file_path}")
|
|
times, distances = parse_input(input_file_path)
|
|
result = total_winning_combinations(times, distances)
|
|
print(f"Final result from input file: {result}")
|
|
|
|
except FileNotFoundError as e:
|
|
print(f"Error: {e}")
|
|
except AssertionError as e:
|
|
print(f"Assertion Error: {e}")
|
|
except Exception as e:
|
|
print(f"An unexpected error occurred: {e}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|