Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- temp2.py 2019-12-08 17:42:06.211398500 +0100
- +++ temp1.py 2019-12-08 17:42:37.739548700 +0100
- @@ -1,11 +1,9 @@
- -
- class IntComputer:
- _src = []
- _ptr = 0
- _in = []
- _out = []
- _status = 'R' # [R]unning, [I]nput, [F]inished
- - _log = False
- def __init__(self, src):
- self._src = src[:]
- @@ -16,69 +14,60 @@
- params = []
- for i in range(n_params):
- if i >= len(param_modes): param_modes.append(0)
- - temp = self._ptr + 1 + i
- + temp = min(self._ptr + 1 + i, len(self._src) -1)
- params.append(temp if param_modes[i] == 1 else self._src[temp])
- - return params if n_params > 1 else params[0]
- -
- + return params
- +
- # Addition <a> <b> [store_at]
- - def _add(self, param_modes):
- - a, b, store_at = self._get_params(3, param_modes)
- - self._src[store_at] = self._src[a] + self._src[b]
- + def _add(self, p):
- + self._src[p[2]] = self._src[p[0]] + self._src[p[1]]
- self._ptr += 4
- -
- +
- # Multiplication <a> <b> [store_at]
- - def _mul(self, param_modes):
- - a, b, store_at = self._get_params(3, param_modes)
- - if self._log: print(f'src[{a}] * src[{b}] = {self._src[a]} * {self._src[b]} -> {store_at}:', end = ' ')
- - self._src[store_at] = self._src[a] * self._src[b]
- - if self._log: print(self._src[store_at])
- + def _mul(self, p):
- + self._src[p[2]] = self._src[p[0]] * self._src[p[1]]
- self._ptr += 4
- -
- +
- # Input [store_at]
- - def _input(self, param_modes):
- + def _input(self, p):
- if len(self._in) > 0:
- - store_at = self._get_params(1, param_modes)
- - self._src[store_at] = self._in.pop(0)
- + self._src[p[0]] = self._in.pop(0)
- self._ptr += 2
- else:
- self._status = 'I'
- return 1
- -
- +
- # Output [get_from]
- - def _output(self, param_modes):
- - self._out.append(self._get_params(1, param_modes))
- + def _output(self, p):
- + self._out.append(self._src[p[0]])
- self._ptr += 2
- -
- +
- # Jump-if-non-zero <flag> <jumpto>
- - def _jz(self, param_modes):
- - flag, jumpto = self._get_params(2, param_modes)
- - if self._src[flag]: self._ptr = self._src[jumpto]
- + def _jz(self, p):
- + if self._src[p[0]]: self._ptr = self._src[p[1]]
- else: self._ptr += 3
- # Jump-if-zero <flag> <jumpto>
- - def _jnz(self, param_modes):
- - flag, jumpto = self._get_params(2, param_modes)
- - if not self._src[flag]: self._ptr = self._src[jumpto]
- + def _jnz(self, p):
- + if not self._src[p[0]]: self._ptr = self._src[p[1]]
- else: self._ptr += 3
- # Less than <a> <b> [store_at]
- - def _lt(self, param_modes):
- - a, b, store_at = self._get_params(3, param_modes)
- - self._src[store_at] = int(self._src[a] < self._src[b])
- + def _lt(self, p):
- + self._src[p[2]] = int(self._src[p[0]] < self._src[p[1]])
- self._ptr += 4
- # Equals <a> <b> [store_at]
- - def _eq(self, param_modes):
- - a, b, store_at = self._get_params(3, param_modes)
- - self._src[store_at] = int(self._src[a] == self._src[b])
- + def _eq(self, p):
- + self._src[p[2]] = int(self._src[p[0]] == self._src[p[1]])
- self._ptr += 4
- -
- - def _halt(self, param_modes):
- +
- + def _halt(self, p):
- self._status = 'F'
- return 1
- -
- +
- _execute = {1: _add, 2: _mul, 3: _input, 4: _output, 5: _jz, 6: _jnz, 7: _lt, 8: _eq, 99: _halt}
- -
- +
- def add_input(self, data):
- self._in.extend(data)
- if self._status == 'I':
- @@ -89,17 +78,18 @@
- data = self._out[:]
- self._out = []
- return data
- -
- +
- def step(self):
- if self._status == 'R':
- opcode = str(self._src[self._ptr])
- param_modes = list(map(int, reversed(list(opcode[:-2]))))
- opcode = int(opcode[-2:])
- - return 1 if self._execute[opcode](self, param_modes) else 0
- + params = self._get_params(3, param_modes)
- + return 1 if self._execute[opcode](self, params) else 0
- return 1
- -
- +
- def status(self): return self._status
- -
- +
- def run(self):
- while not self.step(): pass
- - return self._status
- \ No newline at end of file
- + return self.status()
- \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement