LoginSignup
1
1

More than 5 years have passed since last update.

Brainfu*k by QPython

Last updated at Posted at 2015-07-20

brainfuck.py

from __future__ import print_function
from sys import stdin,stdout
class Brainfuck:
    def __init__(s,OPs="><+-.,[]",size=30000):
        s.clear(size)
        s.const(OPs)
        #return super().__new__(self)
    def compile(s,code):
        s.prgs = []
        tmps = []
        for op in code:
            if not op in s.opDic:
                continue
            prg = s.opDic[op]()
            prg.idx = len(s.prgs)
            if prg.block1:
                tmps += [prg]
            elif prg.block2:
                prg1 = tmps.pop()
                prg.op1 = prg1
                prg1.op2 = prg
            #end if
            s.prgs += [prg]
    def run(s,defmem=None,limit=1000,out=stdout):
        s.pc = 0
        s.out = out
        if not defmem is None:
            s.write(defmem)
        step = 0
        while s.pc<len(s.prgs):
            s.prgs[s.pc].do(s)
            step+=1
            if step > limit:
                raise RuntimeWarning("step limit(%s) over!"%(limit))
                break
    def clear(s,size=None):
        if size is None:
            size = len(s.mem)
            print("size:%d"%size)
        s.mem = bytearray(size)
        s.pt = 0
    def write(s,datam):
        for idx,data in zip(range(len(datam)),datam):
            s.mem[s.pt+idx] = data
    def const(s,OPs):
        s.opDic = {}
        s.opDic[OPs[0]]=opNxt # op >
        s.opDic[OPs[1]]=opPrv # op <
        s.opDic[OPs[2]]=opInc # op +
        s.opDic[OPs[3]]=opDec # op -
        s.opDic[OPs[4]]=opOut # op .
        s.opDic[OPs[5]]=opInp # op ,
        s.opDic[OPs[6]]=opJp1 # op [
        s.opDic[OPs[7]]=opJp2 # op ]
#end class
class op:
    block1 = False
    block2 = False
#end class
class opNxt(op):
    def do(s,bf):
        bf.pt+=1
        bf.pc+=1
#end class
class opPrv(op):
    def do(s,bf):
        bf.pt-=1
        bf.pc+=1
#end class
class opInc(op):
    def do(s,bf):
        bf.mem[bf.pt]+=1
        bf.pc+=1
#end class
class opDec(op):
    def do(s,bf):
        bf.mem[bf.pt]-=1
        bf.pc+=1
#end class
class opInp(op):
    def do(s,bf):
        bf.mem[bf.pt] = stdin.readline()
        bf.pc+=1
#end class
class opOut(op):
    def do(s,bf):
        #print(chr(bf.mem[bf.pt]),end="")
        bf.out.write(chr(bf.mem[bf.pt]))
        bf.pc+=1
#end class
class opJp1(op):
    block1=True
    def do(s,bf):
        if bf.mem[bf.pt]==0:
            bf.pc = s.op2.idx
        bf.pc+=1
#end class
class opJp2(op):
    block2=True
    def do(s,bf):
        if bf.mem[bf.pt]!=0:
            bf.pc = s.op1.idx
        bf.pc+=1
#end class      
1
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1