En este contexto particular, simplemente reemplace '~' por 'no'.
PS. vale, supongo que tendré que explicarlo, empecé a recibir una bofetada con -1, probablemente con la premisa de que no sé la diferencia entre la negación lógica y la de bit a bit.
El problema es que el código en la pregunta es roto. Hay un error en eso. Si comprueba cómo Brainfuck debería funcionar, entra dentro de [] llaves mientras que la celda de memoria actual es! = 0 (esto se comprueba como precondición al ingresar [ y como optimización antes de regresar de ]).
Pero en lugar de discutir, quizás es más fácil mostrarlo con ejemplos de que el código no funciona. Tomemos el sencillo programa '[+]'
. Intentar ajustar esto debería simplemente salir (porque la celda actual es 0, ni siquiera ingresa el bucle). En cambio, si lo ejecuta en este intérprete, entra en un ciclo infinito.
Tan aquel que le solicito a revertir sus -1 votos si mi aclaración tiene sentido ahora ;-)
Aquí está el intérprete ligeramente embellecida, con fija ~
error y yo también agregó el ,
de entrada que faltan:
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
Me resulta divertido que el intérprete de Python BF tenga nombres de variables tan crípticos y esté escrito utilizando tales construcciones de Python no estándar. Muy en el espíritu de BF, pero no en el espíritu de Python. – Omnifarious
i segundo - estilo extraño de codificación (como si se tradujera del lenguaje de bajo nivel a python?) Pero funciona, lo probé con el programa hello-world.por cierto, no implementa el comando ',' (entrada) –
@Omnifarious: si escribiera en el espíritu de Python, no estaría escribiendo un intérprete de BF. –