08_loop.py 922 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. for line in f:
  5. opcode, arg = line.split()
  6. yield opcode, int(arg)
  7. def run(program, acc=0):
  8. ip = 0
  9. seen = [False] * len(program)
  10. while ip < len(program):
  11. if seen[ip]:
  12. return False, acc
  13. seen[ip] = True
  14. opcode, arg = program[ip]
  15. if opcode == 'acc':
  16. acc += arg
  17. elif opcode == 'jmp':
  18. ip += arg - 1
  19. else:
  20. assert opcode == 'nop'
  21. ip += 1
  22. return True, acc
  23. def patch(program):
  24. change = {'nop': 'jmp', 'jmp': 'nop'}
  25. for i, (opcode, arg) in enumerate(program):
  26. if opcode in change:
  27. program[i] = change[opcode], arg
  28. term, acc = run(program)
  29. if term:
  30. return acc
  31. program[i] = opcode, arg
  32. program = list(parse(sys.stdin))
  33. print(run(program)[1])
  34. print(patch(program))