该问题源于一个编写的 brainfuck 解释器,该解释器旨在将 brainfuck 代码转换为输出字符串。但是,执行过程中出现了意外,导致解释器输出的字符串与预期不同。发贴者希望了解原因并寻求帮助。
2、解决方案
原因:
- 循环条件错误:在代码中,循环条件使用 level = 0,导致循环不会被进入,因为条件一经设定就为假。
- 索引位置不正确:在判断是否跳过循环时,应该检查当前指针位置 (即包括当前 [ 或 ]),而不是检查其后的字符。
- 更新指针错误:在代码中,当遇到 [ 或 ] 时,更新的应该是程序指针 (program counter),而不是磁带指针 (tape pointer)。
解决方法:
- 更改循环条件:将 while level > 0 更改为 do…while 循环或 while true 循环,并在循环内检查条件,以决定是否跳出循环。
- 调整索引位置:检查循环条件时,应包含当前指针位置,而不是其后的字符。
- 更新正确指针:当遇到 [ 或 ] 时,应更新程序指针,而不是磁带指针。
代码例子:
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('++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.')


被折叠的 条评论
为什么被折叠?



