19_opjumps.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env python3
  2. import sys
  3. isa = {
  4. 'addr': lambda a, b, reg: reg[a] + reg[b],
  5. 'addi': lambda a, b, reg: reg[a] + b,
  6. 'mulr': lambda a, b, reg: reg[a] * reg[b],
  7. 'muli': lambda a, b, reg: reg[a] * b,
  8. 'banr': lambda a, b, reg: reg[a] & reg[b],
  9. 'bani': lambda a, b, reg: reg[a] & b,
  10. 'borr': lambda a, b, reg: reg[a] | reg[b],
  11. 'bori': lambda a, b, reg: reg[a] | b,
  12. 'setr': lambda a, b, reg: reg[a],
  13. 'seti': lambda a, b, reg: a,
  14. 'gtir': lambda a, b, reg: int(a > reg[b]),
  15. 'gtri': lambda a, b, reg: int(reg[a] > b),
  16. 'gtrr': lambda a, b, reg: int(reg[a] > reg[b]),
  17. 'eqir': lambda a, b, reg: int(a == reg[b]),
  18. 'eqri': lambda a, b, reg: int(reg[a] == b),
  19. 'eqrr': lambda a, b, reg: int(reg[a] == reg[b]),
  20. }
  21. def parse_insts(f):
  22. for line in f:
  23. opcode, operands = line[:-1].split(' ', 1)
  24. a, b, out = map(int, operands.split())
  25. yield opcode, a, b, out
  26. line = sys.stdin.readline()[:-1]
  27. ip = int(line[4:])
  28. program = list(parse_insts(sys.stdin))
  29. # part 1
  30. reg = [0, 0, 0, 0, 0, 0]
  31. while reg[ip] < len(program):
  32. opcode, a, b, out = program[reg[ip]]
  33. #print('%-35s' % reg, opcode, a, b, out)
  34. reg[out] = isa[opcode](a, b, reg)
  35. reg[ip] += 1
  36. print(reg[0])
  37. # part 2
  38. reg = [1, 0, 0, 0, 0, 0]
  39. while reg[ip] != 1:
  40. opcode, a, b, out = program[reg[ip]]
  41. reg[out] = isa[opcode](a, b, reg)
  42. reg[ip] += 1
  43. n = reg[5]
  44. print(sum(0 if n % reg1 else reg1 for reg1 in range(1, n + 1)))