brainfuck intepreter 输出错误

该问题源于一个编写的 brainfuck 解释器,该解释器旨在将 brainfuck 代码转换为输出字符串。但是,执行过程中出现了意外,导致解释器输出的字符串与预期不同。发贴者希望了解原因并寻求帮助。

2、解决方案

原因:

  1. 循环条件错误:在代码中,循环条件使用 level = 0,导致循环不会被进入,因为条件一经设定就为假。
  2. 索引位置不正确:在判断是否跳过循环时,应该检查当前指针位置 (即包括当前 [ 或 ]),而不是检查其后的字符。
  3. 更新指针错误:在代码中,当遇到 [ 或 ] 时,更新的应该是程序指针 (program counter),而不是磁带指针 (tape pointer)。

解决方法:

  1. 更改循环条件:将 while level > 0 更改为 do…while 循环或 while true 循环,并在循环内检查条件,以决定是否跳出循环。
  2. 调整索引位置:检查循环条件时,应包含当前指针位置,而不是其后的字符。
  3. 更新正确指针:当遇到 [ 或 ] 时,应更新程序指针,而不是磁带指针。

代码例子:

def findmatchingclosingbracket(ctr):
    level = 0
    if program[ctr] == '[':
        while True:
            if program[ctr] == '[':
                level += 1
            elif program[ctr] == ']':
                level -= 1
            if level == 0:
                return ctr
                break
            ctr += 1

def findmatchingopeningbracket(ctr):
    level = 0
    if program[ctr] == ']':
        while True:
            if program[ctr] == '[':
                level -= 1
            elif program[ctr] == ']':
                level += 1
            if level == 0:
                return ctr
                break
            ctr -= 1

def brainfuckintepreter(program):
    tape = [0] * 3000
    pointer = 1500
    counter = 0
    results = ""
    valid = True
    while counter != len(program) and valid:
        a = program[counter]
        if a == '>':
            if pointer == len(tape) - 1:
                tape.append(0)
            pointer += 1
        elif a == '<':
            if pointer == 0:
                raise ValueError("On index ", counter, ", the program tried to move to -1 on the tape")
                valid = False
                return valid
            else:
                pointer -= 1
        elif a == '+':
            if tape[pointer] == 255:
                tape[pointer] = 0
            else:
                tape[pointer] += 1
        elif a == '-':
            if tape[pointer] == 0:
                tape[pointer] = 255
            else:
                tape[pointer] -= 1
        elif a == '.':
            t = chr(tape[pointer])
            results += t
            print(t, end='')
        elif a == ',':
            tape[pointer] = ord(sys.stdin.read(1))
        elif a == '[':
            if tape[pointer] == 0:
                counter = findmatchingclosingbracket(counter)
        elif a == ']':
            if tape[pointer] != 0:
                counter = findmatchingopeningbracket(counter)
        counter += 1

brainfuckintepreter('++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值