Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys, urllib.request
- class Brainfuck(object):
- def __init__(self):
- self.memory = [0] * 30000
- self.pointer = 0
- self.ip = 0
- self.ret = ""
- self.safety_net = 0
- def modify(self, value):
- self.memory[self.pointer] = (self.memory[self.pointer]+value) & 0xff
- def move(self, direction):
- self.pointer += direction
- def jump(self, where):
- if self.memory[self.pointer] == 0 or where < self.ip:
- self.ip = where - 1
- def incP(self):
- if self.iX and self.inp != "":
- self.memory[self.pointer] = ord(self.inp[0])
- self.inp = self.inp[1:]
- elif self.iX and self.inp == "":
- self.memory[self.pointer] = 0
- def adR(self, chrr):
- self.ret += chrr
- def prepare(self, code):
- instructions = []
- jump_targets = []
- instr = {
- '+': lambda: self.modify(+1),
- '-': lambda: self.modify(-1),
- '>': lambda: self.move(+1),
- '<': lambda: self.move(-1),
- '.': lambda: self.adR(chr(self.memory[self.pointer])),
- ',': lambda: self.incP(),
- '[': lambda: self.jump(jump_targets[self.ip]),
- ']': lambda: self.jump(jump_targets[self.ip])
- }
- stack = []
- for c in (c for c in code if c in instr):
- jump_targets.append(None)
- instructions.append(instr[c])
- if c == '[':
- stack.append(len(instructions)-1)
- if c == ']':
- begin = stack.pop()
- jump_targets[-1] = begin
- jump_targets[begin] = len(jump_targets)
- return instructions
- def run(self, code, inpp=""):
- if code[:4] == "http":
- code = urllib.request.urlopen(code).read().decode("utf-8")
- instructions = self.prepare(code)
- self.inp = inpp
- self.iX = True
- if inpp == "": self.iX = False
- while self.ip < len(instructions):
- print(code[self.ip])
- instructions[self.ip]()
- self.ip += 1
- self.safety_net += 1
- if self.safety_net > 10000: break
- print(self.ret)
- return self.ret
Advertisement
Add Comment
Please, Sign In to add comment