Para los no iniciados, Brainfuck es un lenguaje Turing completo con sólo 8 órdenes, todos los cuales tienen equivalentes literales en C:Estructuras de control que implementa en Brainfuck
bf c
----------------------
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ while (*ptr) {
] }
En cualquier distribución de Linux que tiene un gestor de paquetes, Debería poder encontrar e instalar el paquete beef
, un intérprete de Brainfuck para que pueda jugar en casa.
Como se puede ver arriba, pero tiene Brainfuck uno estructura de control, que se traduce en […]
C como:
while (*ptr) { … }
que le da todo el control de IF VAR = 0 THEN GOTO 10
desde el BASIC. A continuación se llamará getchar()
hasta que vuelve 0
:
, # *ptr = getchar();
[ # while (*ptr) {
>, # *(++ptr) = getchar();
] # }
Pero lo que si sólo quiero leer a un char nueva línea \n
? Después de tener algunas dificultades para envolver mi cerebro en torno a cómo esto podría ser adaptado para trabajar como un simple if
me ocurrió lo siguiente:
, # *ptr = getchar(); /* store input */
---------- # *ptr -= 10; /* test for \n by subtracting 10 before loop */
[ # while (*ptr) { /* if *ptr == 0, last char read was \n */
++++++++++ # *ptr += 10; /* wasn't \n, add 10 back to val under ptr */
>, # *(++ptr) = getchar();
---------- # *ptr -= 10;
] # }
(Si alguien tiene una mejor forma de hacer esto, por favor hágamelo saber)
Ahora supongamos que quiero probar la salida de ese bucle en \r
además de \n
. ¿Cómo puedo probar cualquiera de los dos, dado que solo tengo una oportunidad para salir del círculo? Mi objetivo es poder emular switch
, anidados if
so if/else if
s.
No puede ser _no_ pregunta seria acerca de un lenguaje tan muerte cerebral. De hecho, así es como debería llamarse: Braindead :-) – paxdiablo
Usted señor, es un hombre valiente. – Pierreten
@SCMadsen Aquí está "Hello World": '++++++++++ [> +++++++> ++++++++++> +++> + <<<<-]> ++. > +. +++++++ .. +++.> ++. << ++++++++++++++++++++.>. +++ .------ .--------.> +.>. ' – NullUserException