Advertisement
Guest User

intputer2

a guest
Dec 7th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.12 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. class Intputer:
  4.   def __init__(self, program, stdout = True):
  5.     self.program = []
  6.     if program is not None:
  7.       self.program = program
  8.      
  9.     self.iptr = 0
  10.     self.exitcode = 0
  11.     self.stdout = stdout
  12.     self.output = []
  13.    
  14.     self.opcodes = {1: self.add,
  15.                     2: self.mul,
  16.                     3: self.cin,
  17.                     4: self.cout,
  18.                     5: self.jit,
  19.                     6: self.jif,
  20.                     7: self.lt,
  21.                     8: self.eq,
  22.                     99: self.end}
  23.          
  24.   def add(self, mode):
  25.     a = self.getvalue(self.iptr + 1, mode[0])
  26.     b = self.getvalue(self.iptr + 2, mode[1])
  27.     c = int(self.program[self.iptr + 3])
  28.     self.program[c] = str(a + b)
  29.     self.iptr += 4
  30.    
  31.   def mul(self, mode):
  32.     a = self.getvalue(self.iptr + 1, mode[0])
  33.     b = self.getvalue(self.iptr + 2, mode[1])
  34.     c = int(self.program[self.iptr + 3])
  35.     self.program[c] = str(a * b)
  36.     self.iptr += 4
  37.    
  38.   def cin(self, mode):
  39.     if len(self.stdin) > 0:
  40.       c = int(self.program[self.iptr + 1])
  41.       self.program[c] = str(self.stdin.pop())
  42.     else:
  43.       self.exitcode = 1 #halt and wait for input
  44.       return
  45.     self.iptr += 2
  46.      
  47.   def cout(self, mode):
  48.     a = self.getvalue(self.iptr + 1, mode[0])
  49.     self.output.append(a)
  50.     if self.stdout:
  51.       print(a)
  52.     self.iptr += 2
  53.    
  54.   def jit(self, mode):
  55.     a = self.getvalue(self.iptr + 1, mode[0])
  56.     b = self.getvalue(self.iptr + 2, mode[1])
  57.     if a != 0:
  58.       self.iptr = b
  59.     else:
  60.       self.iptr += 3
  61.    
  62.   def jif(self, mode):
  63.     a = self.getvalue(self.iptr + 1, mode[0])
  64.     b = self.getvalue(self.iptr + 2, mode[1])
  65.     if a == 0:
  66.       self.iptr = b
  67.     else:
  68.       self.iptr += 3
  69.    
  70.   def lt(self, mode):
  71.     a = self.getvalue(self.iptr + 1, mode[0])
  72.     b = self.getvalue(self.iptr + 2, mode[1])
  73.     c = int(self.program[self.iptr + 3])
  74.     self.program[c] = str(int(a < b))
  75.     self.iptr += 4
  76.  
  77.   def eq(self, mode):
  78.     a = self.getvalue(self.iptr + 1, mode[0])
  79.     b = self.getvalue(self.iptr + 2, mode[1])
  80.     c = int(self.program[self.iptr + 3])
  81.     self.program[c] = str(int(a == b))
  82.     self.iptr += 4
  83.    
  84.   def end(self, mode):
  85.     self.exitcode = -1
  86.    
  87.   def abort(self, error):
  88.     print(error)
  89.     self.exitcode = 2
  90.    
  91.   def getvalue(self, pos, mode):
  92.     if mode == "0":
  93.       return int(self.program[int(self.program[pos])])
  94.     else:
  95.       return int(self.program[pos])
  96.    
  97.   def parsemode(self, v):
  98.     return [s for s in v] + ["0"] * (max(0, 3 - len(v)))
  99.            
  100.   def run(self, stdin):
  101.     self.exitcode = 0
  102.     self.stdin = []
  103.     if stdin is not None:
  104.       self.stdin = [*reversed(stdin)]
  105.     while 0 <= self.iptr < len(self.program) and self.exitcode == 0:
  106.       #print(self.iptr, self.program[self.iptr])
  107.       instr = self.program[self.iptr]
  108.       opcode = int(instr[-2:])
  109.       if opcode in self.opcodes:
  110.         self.opcodes[opcode](self.parsemode(instr[-3::-1]))
  111.       else:
  112.         self.abort("invalid opcode: " + str(opcode))
  113.     return self.output, self.exitcode
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement