with open("input") as f: instructions = [n.strip() for n in f.readlines()] SOURCES = dict() for instruction in instructions: print(instruction) [operation, wire] = instruction.split(" -> ") SOURCES[wire] = operation print(SOURCES) def evaluate_wire(wire): try: return int(wire) except ValueError: pass operation = SOURCES[wire] print("evaluating wire", wire, "; operation:", operation) parameters = operation.split(" ") result = None if "NOT" in operation: [_, a] = parameters result = evaluate_wire(a) ^ 0b1111111111111111 elif "OR" in operation: [a, _, b] = parameters result = evaluate_wire(a) | evaluate_wire(b) elif "AND" in operation: [a, _, b] = parameters result = evaluate_wire(a) & evaluate_wire(b) elif "LSHIFT" in operation: [a, _, b] = parameters result = evaluate_wire(a) << evaluate_wire(b) elif "RSHIFT" in operation: [a, _, b] = parameters result = evaluate_wire(a) >> evaluate_wire(b) else: result = evaluate_wire(operation) SOURCES[wire] = str(result) return result print(evaluate_wire("a")) # for wire in ["d", "e", "f", "g", "h", "i"]: # print("==", wire, "==") # print(evaluate_wire(wire)) # print(SOURCES) print("finish")