···11+import fileinput
22+33+# Read input
44+TAPE = [int(x) for x in fileinput.input()[0].split(',')]
55+TAPE += [None, None, None, None]
66+77+88+def handle_mode(tape, mode_op, a, b, c):
99+ op = mode_op % 100
1010+ mode_a = (mode_op // 100) % 10
1111+ mode_b = (mode_op // 1000) % 10
1212+ mode_c = (mode_op // 10000) % 10
1313+1414+ return op, mode_a, mode_b, mode_c
1515+1616+1717+def emulate(input):
1818+ pc = 0
1919+ tape = TAPE[:]
2020+ outs = []
2121+2222+ while pc < len(tape):
2323+ mode_op, a, b, c = tape[pc:pc+4]
2424+ op, mode_a, mode_b, mode_c = handle_mode(tape, mode_op, a, b, c)
2525+2626+ # ADD a b c
2727+ if op == 1:
2828+ tape[c] = (a if mode_a else tape[a]) + (b if mode_b else tape[b])
2929+ pc += 4
3030+3131+ # MUL a b c
3232+ elif op == 2:
3333+ tape[c] = (a if mode_a else tape[a]) * (b if mode_b else tape[b])
3434+ pc += 4
3535+3636+ # INP a
3737+ elif op == 3:
3838+ tape[a] = input
3939+ pc += 2
4040+4141+ # OUT b
4242+ elif op == 4:
4343+ outs.append(a if mode_a else tape[a])
4444+ pc += 2
4545+4646+ # JZ a b
4747+ elif op == 5:
4848+ if (a if mode_a else tape[a]) != 0:
4949+ pc = (b if mode_b else tape[b])
5050+ else:
5151+ pc += 3
5252+5353+ # JNZ a b
5454+ elif op == 6:
5555+ if (a if mode_a else tape[a]) == 0:
5656+ pc = (b if mode_b else tape[b])
5757+ else:
5858+ pc += 3
5959+6060+ # LT a b c
6161+ elif op == 7:
6262+ tape[c] = 1 if (a if mode_a else tape[a]) < (b if mode_b else tape[b]) else 0
6363+ pc += 4
6464+6565+ # EQ a b c
6666+ elif op == 8:
6767+ tape[c] = 1 if (a if mode_a else tape[a]) == (b if mode_b else tape[b]) else 0
6868+ pc += 4
6969+7070+ # HALT
7171+ elif op == 99:
7272+ if not all(x == 0 for x in outs[:-1]):
7373+ return "Bad output", outs
7474+ return outs[-1]
7575+7676+print "Diagnostic code for system ID 1:", emulate(1)
7777+print "Diagnostic code for system ID 5:", emulate(5)