Smallfuck es un lenguaje similar al brainfuck con celdas de 1 bit. Tiene las siguientes instrucciones:
> Increment the pointer
< Decrement the pointer
* Flip the current bit
[ If the current bit is not set, jump to the instruction after the matching ]
] If the current bit is set, jump to the instruction after the matching [
( or just jump unconditionally to matching [ )
Whatfuck agrega una instrucción más:
? Nondeterministically set the current bit to 0 or 1.
Un programa whatfuck no toma ninguna entrada. Puede dar lugar a una de 3 posibilidades: 1
(aceptar), 0
(rechazar) o puede que nunca se detenga.
El programa dará como resultado 1
si existe una secuencia de bits elegidos para ?
s que da como resultado que el programa termine 1
como el bit actual.
El programa termina con 0
si todas las opciones posibles terminan con el bit actual 0
,
Si algunas opciones no terminan, y todas las opciones que terminan lo hacen 0
, entonces el programa nunca terminará.
Su intérprete debe ejecutar todas las posibilidades simultáneamente. No puede intentar 0
primero y luego intentar 1
, porque algunos programas no terminarán cuando deberían. Por ejemplo, *[?*]*
aceptará con la elección 1
, pero nunca terminará si siempre elige 0
.
Como ejemplo, aquí hay un intérprete de Python 2 que escribí, no golf
Reglas
Su intérprete debe aceptar un programa whatfuck de stdin e imprimir su resultado.
Puede suponer que el programa whatfuck solo contiene caracteres
[]<>*?
La matriz de bits no tiene límites en ambos extremos.
El código más corto gana.
Algunos casos de prueba
Esto fallará si su código siempre lo intenta 0
primero
*[?*]*
1
¿Hay un subconjunto de {-7,-3, 5, 8}
cuya suma es 3?
*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1
¿Hay un subconjunto de {-7,-3, 5, 8}
cuya suma es 4?
*<<<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
0
¿Hay alguna manera de asignar valores booleanos a a
, b
y c
tal que
(a XOR b) AND (a XOR c) AND (b XOR c)
¿es verdad?
?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
t+=(c=='>')-(c=='<');
cont+=c=='>';t-=c=='<';
, otro reemplazandoB=B+[t]*(c=='*')
conB+=[t]*(c=='*')
, y un tercero reemplazandop+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;
conp+=1+F.get(p,0)*-~-b-R.get(p,0)*b;
. ¡Gran respuesta! (Lo siento, ¡sé que esta respuesta es súper vieja!)