Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2020-12-10 - Adapter Array

(original .ipynb)

Day 10 is a sequence of integers (mine is here) which represent some output "joltage" of a given adapter, which it can successfully produce if it receives an input "joltage" of at most 3 less than the output. Part 1 involves sorting the joltage of each adapter, finding the differences between each, collecting the occurence of each difference and multiplying the number of those with difference 1 with those of difference 3. Part 2 involves finding the number of valid combinations of each adapter, such that we can be taken from the beginning joltage of 0 to the final output one.

from collections import defaultdict
puzzle_input_str = open("puzzle_input/day10.txt").read()

test_input_str = """16
10
15
5
1
11
7
19
6
12
4"""


large_test_input_str = """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"""

def parse_adapter_chain(input_str):
    input_values = [int(l) for l in input_str.split("\n")]
    return [n for n in sorted(input_values)]

def part1(input_str):
    adapter_chain = parse_adapter_chain(input_str)
    current_joltage = 0
    joltage_differences = defaultdict(lambda: 0)
    
    for adapter in adapter_chain:
        diff = adapter - current_joltage
        joltage_differences[diff] += 1
        current_joltage = adapter
        
    joltage_differences[3] += 1
    return joltage_differences[1] * joltage_differences[3]   

assert 35 == part1(test_input_str)    
assert 220 == part1(large_test_input_str)

part1(puzzle_input_str)
2482
def part2(input_str):
    adapter_chain = [0] + parse_adapter_chain(input_str)
    rev_adapter_chain = list(reversed(adapter_chain))
    lookup = defaultdict(lambda: 1)
    
    for i, adapter in enumerate(rev_adapter_chain):
            next_i = i - 1
            can_connect = []
            while next_i >= 0:
                next_adapter = rev_adapter_chain[next_i]
                if next_adapter - adapter > 3:
                    break
                can_connect.append(next_adapter)
                next_i -= 1

            if(len(can_connect) > 0):
                lookup[adapter] = sum(lookup[a] for a in can_connect)
    
    return lookup[0]

assert 8 == part2(test_input_str)
assert 19208 == part2(large_test_input_str)

part2(puzzle_input_str)
96717311574016