2020-12-09 - Encoding Error
(original .ipynb)
Day 9 is a sequence of integers (mine is here) which represent some data that has been encoded with some kind of cipher. Part 1 involves identifying a weakness in the cipher, by locating the first number in the sequence that isn't the sum of any digits in the previous 25. Part 2 involves finding a run of >1 consecutive numbers which sum to the number identified in Part 1, and adding the smallest and largest values in this sequence.
from itertools import combinations
test_input_str = """35
20
15
25
47
40
62
55
65
95
102
117
150
182
127
219
299
277
309
576"""
puzzle_input_str = open("puzzle_input/day9.txt", "r").read()
def is_sum_of_two_previous_n_numbers(value, numbers, n):
combos = combinations(numbers, 2)
for x,y in combos:
if x + y == value:
return True
return False
def part1(preamble, input_str):
input_numbers = [int(l) for l in input_str.split("\n")]
numbers = []
for value in input_numbers:
if len(numbers) < preamble:
numbers.append(value)
else:
if not is_sum_of_two_previous_n_numbers(value, numbers, preamble):
return value
else:
numbers.append(value)
numbers.pop(0)
# shouldn't hit this
return -1
assert 127 == part1(5, test_input_str)
part1(25, puzzle_input_str)
776203571
def part2(target, input_str):
input_numbers = [int(l) for l in input_str.split("\n")]
for i, value in enumerate(input_numbers):
numbers = [value]
prev_i = i
while sum(numbers) <= target:
prev_i -= 1
numbers.append(input_numbers[prev_i])
if sum(numbers) == target:
return min(numbers) + max(numbers)
# shouldn't hit this
return -1
assert 62 == part2(127, test_input_str)
part2(776203571, puzzle_input_str)
104800569