2024-12-07 - Bridge Repair
(original .ipynb)
Day 7 puzzle input is a list of values followed by a sequence of "equations" that don't have any operators between them, mine is here). Part 1 involves inserting either addition or multiplication operators to make the equation compute the reading value. Part 2 involves doing the same but with the addition of a concatenation operator (where 1 || 2 gives 12)
puzzle_input_str = open("./puzzle_input/day7.txt").read()
test_input_str = """190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20"""
def parse_line(line):
target_value, rest = line.split(": ")
return [
int(target_value),
[int(s) for s in rest.split(" ")]
]
operations = (
lambda a, b: a + b,
lambda a, b: a * b,
)
def solve(target, total, values):
if len(values) == 0:
return target == total
return any(
solve(target, op(values[0], total), values[1:])
for op in operations
)
def part_one(input_str):
equations = (parse_line(line) for line in input_str.splitlines())
return sum(
target
for target, values
in equations
if solve(target, values[0], values[1:])
)
assert 3749 == part_one(test_input_str)
print("part one:", part_one(puzzle_input_str))
part one: 7885693428401
operations = operations + (
(lambda a, b: int(str(b) + str(a))),
)
def part_two(input_str):
equations = (parse_line(line) for line in input_str.splitlines())
return sum(
target for target, values
in equations
if solve(target, values[0], values[1:])
)
assert 11387 == part_two(test_input_str)
print("part two:", part_two(puzzle_input_str))
part two: 348360680516005