import numpy as np # --- Day 10: Adapter Array --- # Patched into the aircraft's data port, you discover weather forecasts of a # massive tropical storm. Before you can figure out whether it will impact your # vacation plans, however, your device suddenly turns off! # Its battery is dead. # You'll need to plug it in. There's only one problem: the charging outlet near # your seat produces the wrong number of jolts. Always prepared, you make a # list of all of the joltage adapters in your bag. # Each of your joltage adapters is rated for a specific output joltage (your # puzzle input). Any given adapter can take an input 1, 2, or 3 jolts lower # than its rating and still produce its rated output joltage. # In addition, your device has a built-in joltage adapter rated for 3 jolts # higher than the highest-rated adapter in your bag. (If your adapter list were # 3, 9, and 6, your device's built-in adapter would be rated for 12 jolts.) # Treat the charging outlet near your seat as having an effective joltage # rating of 0. # Since you have some time to kill, you might as well test all of your # adapters. Wouldn't want to get to your resort and realize you can't even # charge your device! # If you use every adapter in your bag at once, what is the distribution of # joltage differences between the charging outlet, the adapters, and your # device? # For example, suppose that in your bag, you have adapters with the following # joltage ratings: # 16 # 10 # 15 # 5 # 1 # 11 # 7 # 19 # 6 # 12 # 4 # With these adapters, your device's built-in joltage adapter would be rated # for 19 + 3 = 22 jolts, 3 higher than the highest-rated adapter. # Because adapters can only connect to a source 1-3 jolts lower than its # rating, in order to use every adapter, you'd need to choose them like this: # The charging outlet has an effective rating of 0 jolts, so the only # adapters that could connect to it directly would need to have a joltage # rating of 1, 2, or 3 jolts. Of these, only one you have is an adapter rated 1 # jolt (difference of 1). # From your 1-jolt rated adapter, the only choice is your 4-jolt rated # adapter (difference of 3). # From the 4-jolt rated adapter, the adapters rated 5, 6, or 7 are valid # choices. However, in order to not skip any adapters, you have to pick the # adapter rated 5 jolts (difference of 1). # Similarly, the next choices would need to be the adapter rated 6 and then # the adapter rated 7 (with difference of 1 and 1). # The only adapter that works with the 7-jolt rated adapter is the one # rated 10 jolts (difference of 3). # From 10, the choices are 11 or 12; choose 11 (difference of 1) and then # 12 (difference of 1). # After 12, only valid adapter has a rating of 15 (difference of 3), then # 16 (difference of 1), then 19 (difference of 3). # Finally, your device's built-in adapter is always 3 higher than the # highest adapter, so its rating is 22 jolts (always a difference of 3). # In this example, when using every adapter, there are 7 differences of 1 jolt # and 5 differences of 3 jolts. # Here is a larger example: # 28 # 33 # 18 # 42 # 31 # 14 # 46 # 20 # 48 # 47 # 24 # 23 # 49 # 45 # 19 # 38 # 39 # 11 # 1 # 32 # 25 # 35 # 8 # 17 # 7 # 9 # 4 # 2 # 34 # 10 # 3 # In this larger example, in a chain that uses all of the adapters, there are # 22 differences of 1 jolt and 10 differences of 3 jolts. # Find a chain that uses all of your adapters to connect the charging outlet to # your device's built-in adapter and count the joltage differences between the # charging outlet, the adapters, and your device. What is the number of 1-jolt # differences multiplied by the number of 3-jolt differences? with open("files/P10.txt", "r") as f: inputs = [int(num) for num in f.read().strip().split("\n")] def part_1() -> None: # Add zero (charging outlet) and max+3 (device own built-in adapter) joltages = sorted(inputs + [0, max(inputs) + 3]) joltages_diffs = np.diff(joltages) print( f"The difference is {np.sum(joltages_diffs == 1) * np.sum(joltages_diffs == 3)}" ) if __name__ == "__main__": part_1()