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 1si existe una secuencia de bits elegidos para ?s que da como resultado que el programa termine 1como el bit actual.
El programa termina con 0si 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 0primero 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 0primero
*[?*]*
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, by ctal que
(a XOR b) AND (a XOR c) AND (b XOR c) ¿es verdad?
?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
fuente

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!)Cinta infinita ahoy!
Haskell, 516
fuente
Pitón (
405399379)Toma la entrada en una línea, pero "puedo asumir que el programa whatfuck solo contiene caracteres
[]<>*?" y la nueva línea no está en esa lista: Pw, i, p, a = {}, 0, raw_input (), [(0,0, [], [])] para c en p: si c == '[': a + = i, si c == ']': g = a.pop (); w [i], w [g] = g, i i + = 1 i, z = 0, lambda l: ly l.pop () o 0 mientras que a: n, c, l, r = a.pop (0) intente: o = p [n] excepto: si c: i = 1; descanso Seguir si o == '*': c = no c si o == '>': l + = c,; c = z (r) si o == '<': r + = c,; c = z (l) si o en '[]' y (']' == o) == c: n = w [n] si o == '?': a + = (n + 1, no c, l [:], r [:]), a + = (n + 1, c, l, r), imprimir ifuente
.append(item)->+=[item], elimineky reemplace todas las llamadas cona+=[...]para guardar algunos caracteres.+=item,que es aún más corto.