Advertisement
Guest User

#pincheb0lu

a guest
Dec 8th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.45 KB | None | 0 0
  1. --- temp2.py    2019-12-08 17:42:06.211398500 +0100
  2. +++ temp1.py    2019-12-08 17:42:37.739548700 +0100
  3. @@ -1,11 +1,9 @@
  4. -
  5.  class IntComputer:
  6.      _src = []
  7.      _ptr = 0
  8.      _in  = []
  9.      _out = []
  10.      _status = 'R' # [R]unning, [I]nput, [F]inished
  11. -    _log = False
  12.  
  13.      def __init__(self, src):
  14.          self._src = src[:]
  15. @@ -16,69 +14,60 @@
  16.          params = []
  17.          for i in range(n_params):
  18.              if i >= len(param_modes): param_modes.append(0)
  19. -            temp = self._ptr + 1 + i
  20. +            temp = min(self._ptr + 1 + i, len(self._src) -1)
  21.              params.append(temp if param_modes[i] == 1 else self._src[temp])
  22. -        return params if n_params > 1 else params[0]
  23. -
  24. +        return params
  25. +    
  26.      # Addition <a> <b> [store_at]
  27. -    def _add(self, param_modes):
  28. -        a, b, store_at = self._get_params(3, param_modes)
  29. -        self._src[store_at] = self._src[a] + self._src[b]
  30. +    def _add(self, p):
  31. +        self._src[p[2]] = self._src[p[0]] + self._src[p[1]]
  32.          self._ptr += 4
  33. -
  34. +    
  35.      # Multiplication <a> <b> [store_at]
  36. -    def _mul(self, param_modes):
  37. -        a, b, store_at = self._get_params(3, param_modes)
  38. -        if self._log: print(f'src[{a}] * src[{b}] = {self._src[a]} * {self._src[b]} -> {store_at}:', end = ' ')
  39. -        self._src[store_at] = self._src[a] * self._src[b]
  40. -        if self._log: print(self._src[store_at])
  41. +    def _mul(self, p):
  42. +        self._src[p[2]] = self._src[p[0]] * self._src[p[1]]
  43.          self._ptr += 4
  44. -
  45. +    
  46.      # Input [store_at]
  47. -    def _input(self, param_modes):
  48. +    def _input(self, p):
  49.          if len(self._in) > 0:
  50. -            store_at = self._get_params(1, param_modes)
  51. -            self._src[store_at] = self._in.pop(0)
  52. +            self._src[p[0]] = self._in.pop(0)
  53.              self._ptr += 2
  54.          else:
  55.              self._status = 'I'
  56.              return 1
  57. -
  58. +    
  59.      # Output [get_from]
  60. -    def _output(self, param_modes):
  61. -        self._out.append(self._get_params(1, param_modes))
  62. +    def _output(self, p):
  63. +        self._out.append(self._src[p[0]])
  64.          self._ptr += 2
  65. -    
  66. +
  67.      # Jump-if-non-zero <flag> <jumpto>
  68. -    def _jz(self, param_modes):
  69. -        flag, jumpto = self._get_params(2, param_modes)
  70. -        if self._src[flag]: self._ptr = self._src[jumpto]
  71. +    def _jz(self, p):
  72. +        if self._src[p[0]]: self._ptr = self._src[p[1]]
  73.          else: self._ptr += 3
  74.      
  75.      # Jump-if-zero <flag> <jumpto>
  76. -    def _jnz(self, param_modes):
  77. -        flag, jumpto = self._get_params(2, param_modes)
  78. -        if not self._src[flag]: self._ptr = self._src[jumpto]
  79. +    def _jnz(self, p):
  80. +        if not self._src[p[0]]: self._ptr = self._src[p[1]]
  81.          else: self._ptr += 3
  82.      
  83.      # Less than <a> <b> [store_at]
  84. -    def _lt(self, param_modes):
  85. -        a, b, store_at = self._get_params(3, param_modes)
  86. -        self._src[store_at] = int(self._src[a] < self._src[b])
  87. +    def _lt(self, p):
  88. +        self._src[p[2]] = int(self._src[p[0]] < self._src[p[1]])
  89.          self._ptr += 4
  90.      
  91.      # Equals <a> <b> [store_at]
  92. -    def _eq(self, param_modes):
  93. -        a, b, store_at = self._get_params(3, param_modes)
  94. -        self._src[store_at] = int(self._src[a] == self._src[b])
  95. +    def _eq(self, p):
  96. +        self._src[p[2]] = int(self._src[p[0]] == self._src[p[1]])
  97.          self._ptr += 4
  98. -    
  99. -    def _halt(self, param_modes):
  100. +
  101. +    def _halt(self, p):
  102.          self._status = 'F'
  103.          return 1
  104. -
  105. +    
  106.      _execute = {1: _add, 2: _mul, 3: _input, 4: _output, 5: _jz, 6: _jnz, 7: _lt, 8: _eq, 99: _halt}
  107. -
  108. +    
  109.      def add_input(self, data):
  110.          self._in.extend(data)
  111.          if self._status == 'I':
  112. @@ -89,17 +78,18 @@
  113.          data = self._out[:]
  114.          self._out = []
  115.          return data
  116. -    
  117. +
  118.      def step(self):
  119.          if self._status == 'R':
  120.              opcode = str(self._src[self._ptr])
  121.              param_modes = list(map(int, reversed(list(opcode[:-2]))))
  122.              opcode = int(opcode[-2:])
  123. -            return 1 if self._execute[opcode](self, param_modes) else 0
  124. +            params = self._get_params(3, param_modes)
  125. +            return 1 if self._execute[opcode](self, params) else 0
  126.          return 1
  127. -
  128. +    
  129.      def status(self): return self._status
  130. -
  131. +    
  132.      def run(self):
  133.          while not self.step(): pass
  134. -        return self._status
  135. \ No newline at end of file
  136. +        return self.status()
  137. \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement