Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. # Instruction set
  2. class I:
  3. OutputVal = 0
  4. ToggleVal = 1
  5. MoveFward = 2
  6. MoveBward = 3
  7. JmpFIfNot = 4
  8. JmpBIfSet = 5
  9.  
  10. class Tape(list):
  11. def expand(self, n):
  12. self += [0] * (n - len(self))
  13.  
  14. def __getitem__(self, i):
  15. self.expand(i + 1)
  16. return super().__getitem__(i)
  17.  
  18. def __setitem__(self, i, x):
  19. self.expand(i + 1)
  20. return super().__setitem__(i, x)
  21.  
  22. def jump_table(tm):
  23. jumps, jump_stack = {}, []
  24. for ptr, instr in enumerate(tm):
  25. if instr == I.JmpFIfNot:
  26. jump_stack.append(ptr)
  27. elif instr == I.JmpBIfSet:
  28. if jump_stack:
  29. s = jump_stack.pop()
  30. jumps[s], jumps[ptr] = ptr, s
  31. else:
  32. jumps[ptr] = 0
  33. jumps.update({ptr: 0 for ptr in jump_stack})
  34. return jumps
  35.  
  36. def print_state(tape, t):
  37. print(''.join(str(v) for v in tape))
  38. print(' ' * t + '^')
  39. print()
  40.  
  41. def run(tm):
  42. tape, p, t = Tape(), 0, 0
  43. jumps = jump_table(tm)
  44. while p < len(tm):
  45. x = tm[p]
  46. if x == I.OutputVal: yield tape[t]
  47. elif x == I.ToggleVal: tape[t] = 1 - tape[t]
  48. elif x == I.MoveFward: t += 1
  49. elif x == I.MoveBward: t = t - 1 if t else 0
  50. elif x == I.JmpFIfNot: p = jumps[p] if tape[t] == 0 else p
  51. elif x == I.JmpBIfSet: p = jumps[p] if tape[t] == 1 else p
  52. else: raise NotImplementedError
  53. print_state(tape, t)
  54. p += 1
  55.  
  56.  
  57.  
  58. # Example
  59. # Print the members of {0^(4-n) 1^(n + 1) | n = 0..4}
  60.  
  61. prog = '12222213333' + 0*" Put 00001 on the tape, with 1 at the beginning" \
  62. + '141' + 0*" End of loop while there are still zeros" \
  63. + '1410215' + 0*" Output initial zeros" \
  64. + '14025' + 0*" Output remaining ones" \
  65. + '343513' + 0*" Go back, set last zero to one" \
  66. + '14131512' + 0*" Go back, skipping over zeros" \
  67. + '151' + 0*" End of loop while there are still zeros" \
  68. + '4025' + 0*" Output remaining ones" \
  69.  
  70. tm = [int(x) for x in prog.strip()]
  71. print(''.join(map(str, run(tm))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement