Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- class Intputer:
- def __init__(self, program, stdout = True):
- self.program = []
- if program is not None:
- self.program = program
- self.iptr = 0
- self.exitcode = 0
- self.stdout = stdout
- self.output = []
- self.opcodes = {1: self.add,
- 2: self.mul,
- 3: self.cin,
- 4: self.cout,
- 5: self.jit,
- 6: self.jif,
- 7: self.lt,
- 8: self.eq,
- 99: self.end}
- def add(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- c = int(self.program[self.iptr + 3])
- self.program[c] = str(a + b)
- self.iptr += 4
- def mul(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- c = int(self.program[self.iptr + 3])
- self.program[c] = str(a * b)
- self.iptr += 4
- def cin(self, mode):
- if len(self.stdin) > 0:
- c = int(self.program[self.iptr + 1])
- self.program[c] = str(self.stdin.pop())
- else:
- self.exitcode = 1 #halt and wait for input
- return
- self.iptr += 2
- def cout(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- self.output.append(a)
- if self.stdout:
- print(a)
- self.iptr += 2
- def jit(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- if a != 0:
- self.iptr = b
- else:
- self.iptr += 3
- def jif(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- if a == 0:
- self.iptr = b
- else:
- self.iptr += 3
- def lt(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- c = int(self.program[self.iptr + 3])
- self.program[c] = str(int(a < b))
- self.iptr += 4
- def eq(self, mode):
- a = self.getvalue(self.iptr + 1, mode[0])
- b = self.getvalue(self.iptr + 2, mode[1])
- c = int(self.program[self.iptr + 3])
- self.program[c] = str(int(a == b))
- self.iptr += 4
- def end(self, mode):
- self.exitcode = -1
- def abort(self, error):
- print(error)
- self.exitcode = 2
- def getvalue(self, pos, mode):
- if mode == "0":
- return int(self.program[int(self.program[pos])])
- else:
- return int(self.program[pos])
- def parsemode(self, v):
- return [s for s in v] + ["0"] * (max(0, 3 - len(v)))
- def run(self, stdin):
- self.exitcode = 0
- self.stdin = []
- if stdin is not None:
- self.stdin = [*reversed(stdin)]
- while 0 <= self.iptr < len(self.program) and self.exitcode == 0:
- #print(self.iptr, self.program[self.iptr])
- instr = self.program[self.iptr]
- opcode = int(instr[-2:])
- if opcode in self.opcodes:
- self.opcodes[opcode](self.parsemode(instr[-3::-1]))
- else:
- self.abort("invalid opcode: " + str(opcode))
- return self.output, self.exitcode
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement