import aoclib import math DAY = 13 TEST_SOLUTION_PART1 = 295 TEST_SOLUTION_PART2 = 1068781 def part1(test_mode=False): my_input = aoclib.getInputAsArraySplit(day=DAY, split_char=",", test=test_mode) my_arrival = int(my_input[0][0]) bus_ids = [int(i) for i in my_input[1] if i != 'x'] waiting_times = [i - my_arrival % i for i in bus_ids] min_waiting_time = min(waiting_times) return min_waiting_time * bus_ids[waiting_times.index(min_waiting_time)] def part2(test_mode=False): my_input = aoclib.getInputAsArraySplit(day=DAY, split_char=",", test=test_mode) bus_ids = {-i: int(v) for i, v in enumerate(my_input[1]) if v != 'x'} lowest_common_multiple = math.lcm(*bus_ids.values()) base_multipliers = [lowest_common_multiple // interval for interval in bus_ids.values()] modular_multiplicative_inverses = [ pow(base_multiplier, -1, interval) for base_multiplier, interval in zip(base_multipliers, bus_ids.values()) ] return sum( offset * multiplier * mmi for offset, multiplier, mmi in zip(bus_ids.keys(), base_multipliers, modular_multiplicative_inverses) ) % lowest_common_multiple