在这种特殊情况下,只需将 '~' 替换为 'not'。
PS。好的,我想我将不得不解释-开始被-1打耳光,可能是在我不知道逻辑否定和按位否定之间的区别的前提下。
问题是,问题中的代码已损坏。它有一个错误。如果您检查 Brainfuck 应该如何工作,它会在当前记忆单元为 !=0 时在[ ]大括号内循环(这在输入[时作为先决条件进行检查,在从]返回之前作为优化检查)。
但与其争论,或许更容易用代码不工作的例子来展示。让我们来看看这个简单的程序'[+]'
。尝试调整它应该退出(因为当前单元格为 0,它甚至进入循环)。相反,如果你在这个解释器中运行它,它会进入无限循环。
因此,如果我的澄清现在有意义,我会请您恢复您的 -1 票;-)
这是稍微美化的解释器,修复了~
错误,我还添加了缺失的,
输入:
from sys import stdin, stdout
bfHelloWorld = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
# http://esoteric.sange.fi/brainfuck/bf-source/prog/yapi.b
bfPiDigits = '''> +++++ (5 digits)
[<+>>>>>>>>++++++++++<<<<<<<-]>+++++[<+++++++++>-]+>>>>>>+[<<+++[>>[-<]<[>]<-]>>
[>+>]<[<]>]>[[->>>>+<<<<]>>>+++>-]<[<<<<]<<<<<<<<+[->>>>>>>>>>>>[<+[->>>>+<<<<]>
>>>>]<<<<[>>>>>[<<<<+>>>>-]<<<<<-[<<++++++++++>>-]>>>[<<[<+<<+>>>-]<[>+<-]<++<<+
>>>>>>-]<<[-]<<-<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+<<<-[>>+<<-]<]<<<<+>>>>>>>
>[-]>[<<<+>>>-]<<++++++++++<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+>[<<+<+>>>-]<<<
<+<+>>[-[-[-[-[-[-[-[-[-<->[-<+<->>]]]]]]]]]]<[+++++[<<<++++++++<++++++++>>>>-]<
<<<+<->>>>[>+<<<+++++++++<->>>-]<<<<<[>>+<<-]+<[->-<]>[>>.<<<<[+.[-]]>>-]>[>>.<<
-]>[-]>[-]>>>[>>[<<<<<<<<+>>>>>>>>-]<<-]]>>[-]<<<[-]<<<<<<<<]++++++++++.
'''
code = bfPiDigits # the code
data = [0] * 255 # data memory
cp = 0 # code pointer
dp = 0 # data pointer
while cp < len(code):
cmd = code[cp]
if cmd == '>': dp += 1
elif cmd == '<': dp -= 1
elif cmd == '+': data[dp] += 1
elif cmd == '-': data[dp] -= 1
elif cmd == '.': stdout.write(chr(data[dp]))
elif cmd == ',': data[dp] = ord(stdin.read(1))
elif cmd == '[' and not data[dp]: # skip loop if ==0
n = 0
while True:
cmd = code[cp]
if cmd == '[': n += 1
elif cmd == ']': n -= 1
if not n: break
cp += 1
elif cmd == ']' and data[dp]: # loop back if !=0
n = 0
while True:
cmd = code[cp]
if cmd == '[': n+=1
elif cmd == ']': n-=1
if not n: break
cp -= 1
cp += 1