Guest User

Untitled

a guest
Oct 13th, 2013
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.00 KB | None | 0 0
  1. import sys, urllib.request
  2.  
  3. class Brainfuck(object):
  4.         def __init__(self):
  5.                 self.memory = [0] * 30000
  6.                 self.pointer = 0
  7.                 self.ip = 0
  8.                 self.ret = ""
  9.                 self.safety_net = 0
  10.                
  11.         def modify(self, value):
  12.                 self.memory[self.pointer] = (self.memory[self.pointer]+value) & 0xff
  13.                
  14.         def move(self, direction):
  15.                 self.pointer += direction
  16.        
  17.         def jump(self, where):
  18.                 if self.memory[self.pointer] == 0 or where < self.ip:
  19.                         self.ip = where - 1
  20.                        
  21.         def incP(self):
  22.                 if self.iX and self.inp != "":
  23.                         self.memory[self.pointer] = ord(self.inp[0])
  24.                         self.inp = self.inp[1:]
  25.                 elif self.iX and self.inp == "":
  26.                         self.memory[self.pointer] = 0
  27.                        
  28.         def adR(self, chrr):
  29.                 self.ret += chrr
  30.        
  31.         def prepare(self, code):
  32.                 instructions = []
  33.                 jump_targets = []
  34.                
  35.                 instr = {
  36.                         '+': lambda: self.modify(+1),
  37.                         '-': lambda: self.modify(-1),
  38.                         '>': lambda: self.move(+1),
  39.                         '<': lambda: self.move(-1),
  40.                         '.': lambda: self.adR(chr(self.memory[self.pointer])),
  41.                         ',': lambda: self.incP(),
  42.                         '[': lambda: self.jump(jump_targets[self.ip]),
  43.                         ']': lambda: self.jump(jump_targets[self.ip])
  44.                 }
  45.                
  46.                 stack = []
  47.                 for c in (c for c in code if c in instr):
  48.                         jump_targets.append(None)
  49.                         instructions.append(instr[c])
  50.                
  51.                         if c == '[':
  52.                                 stack.append(len(instructions)-1)
  53.                
  54.                         if c == ']':
  55.                                 begin = stack.pop()
  56.                                 jump_targets[-1] = begin
  57.                                 jump_targets[begin] = len(jump_targets)
  58.                
  59.                 return instructions
  60.        
  61.         def run(self, code, inpp=""):
  62.                 if code[:4] == "http":
  63.                         code = urllib.request.urlopen(code).read().decode("utf-8")
  64.                        
  65.  
  66.                 instructions = self.prepare(code)
  67.                 self.inp = inpp
  68.                 self.iX = True
  69.                 if inpp == "": self.iX = False
  70.  
  71.                 while self.ip < len(instructions):
  72.                         print(code[self.ip])
  73.                         instructions[self.ip]()
  74.                         self.ip += 1
  75.                         self.safety_net += 1
  76.                         if self.safety_net > 10000: break
  77.  
  78.                 print(self.ret)
  79.                 return self.ret
Advertisement
Add Comment
Please, Sign In to add comment