23_computer.py 1008 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. def cast(op):
  5. return int(op) if op[0] in '+-' else op
  6. for line in f:
  7. opcode, ops = line.rstrip().split(' ', 1)
  8. if ',' in ops:
  9. op1, op2 = ops.split(', ')
  10. yield opcode, cast(op1), cast(op2)
  11. else:
  12. yield opcode, cast(ops), None
  13. def run(program, a):
  14. regs = {'a': a, 'b': 0}
  15. pc = 0
  16. while pc < len(program):
  17. opcode, op1, op2 = program[pc]
  18. if opcode == 'hlf':
  19. regs[op1] //= 2
  20. elif opcode == 'tpl':
  21. regs[op1] *= 3
  22. elif opcode == 'inc':
  23. regs[op1] += 1
  24. elif opcode == 'jmp':
  25. pc += op1 - 1
  26. elif opcode == 'jie':
  27. if regs[op1] % 2 == 0:
  28. pc += op2 - 1
  29. elif opcode == 'jio':
  30. if regs[op1] == 1:
  31. pc += op2 - 1
  32. pc += 1
  33. return regs['b']
  34. program = list(parse(sys.stdin))
  35. print(run(program, 0))
  36. print(run(program, 1))