diff --git a/day13.py b/day13.py new file mode 100644 index 0000000..37786de --- /dev/null +++ b/day13.py @@ -0,0 +1,37 @@ +import aoclib +import math +import sys + +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 diff --git a/inputs/13 b/inputs/13 new file mode 100644 index 0000000..36b4e71 --- /dev/null +++ b/inputs/13 @@ -0,0 +1,2 @@ +1008832 +23,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,449,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,13,19,x,x,x,x,x,x,x,x,x,29,x,991,x,x,x,x,x,37,x,x,x,x,x,x,x,x,x,x,17 diff --git a/inputs/13_test b/inputs/13_test new file mode 100644 index 0000000..0c14fb8 --- /dev/null +++ b/inputs/13_test @@ -0,0 +1,3 @@ +939 +7,13,x,x,59,x,31,19 +17,x,13,19