from ops import ops from copy import copy from pprint import pprint with open('input.txt', 'r') as f: raw = f.readlines() samples = [] i = 0 while 1: sample = {} if raw[i] == '\n': break sample['in'] = [int(x) for x in raw[i][9:-2].split(', ')] sample['op'] = [int(x) for x in raw[i + 1].strip().split(' ')] sample['out'] = [int(x) for x in raw[i + 2][9:-2].split(', ')] samples.append(sample) i += 4 # print(samples) observations = dict() for sample in samples: count = 0 num, a, b, c = sample['op'] valid = set() for op in ops: try: if sample['out'] == op(copy(sample['in']), a, b, c): count += 1 valid.add(op) except: pass if observations.get(num) is None: observations[num] = valid else: observations[num] = observations[num].intersection(valid) # pprint(observations) ops_map = dict() while len(observations) != 0: to_del = list() for num, funcs in observations.items(): funcs = funcs - set(ops_map.values()) if len(funcs) == 1: ops_map[num] = next(iter(funcs)) to_del.append(num) for num in to_del: del observations[num] pprint(ops_map) with open('input.txt', 'r') as f: raw = f.readlines() instructions = [] for line in raw[i + 2:]: instructions.append([int(x) for x in line.strip().split(' ')]) pprint(instructions) reg = [0, 0, 0, 0] for ins in instructions: num, a, b, c = ins reg = ops_map[num](reg, a, b, c) print(reg) print(reg[0])