2017-12-08 - I Heard You Like Registers
(original .ipynb)import math from collections import defaultdict puzzle_input_test = """ b inc 5 if a > 1 a inc 1 if b < 5 c dec -10 if a >= 1 c inc -20 if c == 10 """ puzzle_input = open("./puzzle_input/day8.txt", "r").read() def cmp_gt(register_file, reg, val): return register_file[reg] > val def cmp_ge(register_file, reg, val): return register_file[reg] >= val def cmp_lt(register_file, reg, val): return register_file[reg] < val def cmp_le(register_file, reg, val): return register_file[reg] <= val def cmp_eq(register_file, reg, val): return register_file[reg] == val def cmp_ne(register_file, reg, val): return register_file[reg] != val def op_inc(register_file, reg, val): register_file[reg] += val def op_dec(register_file, reg, val): register_file[reg] -= val op_table = { "inc": op_inc, "dec": op_dec } cmp_table = { ">": cmp_gt, ">=": cmp_ge, "<": cmp_lt, "<=": cmp_le, "==": cmp_eq, "!=": cmp_ne } def parse_line(line): dest_reg, op_str, op_val_str, _, cmp_reg, cmp_str, cmp_val_str = line.split(" ") op = op_table[op_str] op_val = int(op_val_str) cmp = cmp_table[cmp_str] cmp_val = int(cmp_val_str) return (dest_reg, op, op_val, cmp_reg, cmp, cmp_val) def execute_line(register_file, dest_reg, op, op_val, cmp_reg, cmp, cmp_val): if cmp(register_file, cmp_reg, cmp_val): op(register_file, dest_reg, op_val) def run_program(input_str): instructions = [ parse_line(line) for line in input_str.strip().split("\n") if len(line) > 0 ] register_file = defaultdict(lambda: 0) for dest_reg, op, op_val, cmp_reg, cmp, cmp_val in instructions: execute_line(register_file, dest_reg, op, op_val, cmp_reg, cmp, cmp_val) return register_file def largest_value(register_file): largest_val = -math.inf for reg in register_file.keys(): if register_file[reg] > largest_val: largest_val = register_file[reg] return largest_val # part 1 - just run and find the largest register value def solve(input_str): register_file = run_program(input_str) return largest_value(register_file) # solve(puzzle_input_test.strip()) print("part one:", solve(puzzle_input.strip()))
part one: 7787
# part 2 - largest register value we encounter during execution def solve_part2(input_str): instructions = [ parse_line(line) for line in input_str.strip().split("\n") if len(line) > 0 ] register_file = defaultdict(lambda: 0) largest_val = -math.inf for dest_reg, op, op_val, cmp_reg, cmp, cmp_val in instructions: execute_line(register_file, dest_reg, op, op_val, cmp_reg, cmp, cmp_val) largest_val_current = largest_value(register_file) if largest_val_current > largest_val: largest_val = largest_val_current return largest_val # solve_part2(puzzle_input_test.strip()) print("part two", solve_part2(puzzle_input.strip()))
part two 8997