Smallfuck é uma linguagem semelhante ao cérebro com células de 1 bit. Possui as seguintes instruções:
> 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 acrescenta mais uma instrução:
? Nondeterministically set the current bit to 0 or 1.
Um programa whatfuck não recebe nenhuma entrada. Pode resultar em uma das três possibilidades: 1
(aceitar), 0
(rejeitar) ou nunca pode parar.
O programa resultará 1
se existir uma sequência de bits escolhida para ?
s, o que resultará no término do programa 1
como o bit atual.
O programa termina com 0
se todas as opções possíveis terminarem com o bit atual 0
,
Se algumas opções não terminarem e todas as opções terminarem 0
, o programa nunca terminará.
Seu intérprete deve executar todas as possibilidades simultaneamente. Você não pode tentar 0
primeiro e depois tentar 1
, porque alguns programas não terminam quando deveriam. Por exemplo, *[?*]*
aceitará com a escolha 1
, mas nunca será encerrada se você sempre escolher 0
.
Como exemplo, aqui está um intérprete de python 2 que escrevi, não joguei golfe
Regras
Seu intérprete deve aceitar um programa whatfuck da stdin e imprimir seu resultado.
Você pode assumir que o programa whatfuck contém apenas caracteres
[]<>*?
A matriz de bits é ilimitada nas duas extremidades.
O menor código vence.
Alguns casos de teste
Isso falhará se seu código sempre tentar 0
primeiro
*[?*]*
1
Existe um subconjunto {-7,-3, 5, 8}
cuja soma é 3?
*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1
Existe um subconjunto {-7,-3, 5, 8}
cuja soma é 4?
*<<<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
0
Existe uma maneira de atribuir valores booleanos a a
, b
e c
de tal forma que
(a XOR b) AND (a XOR c) AND (b XOR c)
é verdade?
?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
fonte
t+=(c=='>')-(c=='<');
port+=c=='>';t-=c=='<';
, outro substituindoB=B+[t]*(c=='*')
porB+=[t]*(c=='*')
e um terceiro substituindop+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;
porp+=1+F.get(p,0)*-~-b-R.get(p,0)*b;
. Ótima resposta! (Desculpe, eu sei que esta resposta é super velho!)Fita infinita ahoy!
Haskell, 516
fonte
Python (
405399379)Leva a entrada em uma linha, mas "posso assumir que o programa whatfuck contém apenas caracteres
[]<>*?
" e a nova linha não está nessa lista: Pfonte
.append(item)
->+=[item]
, removak
e substitua todas as chamadas pora+=[...]
para salvar alguns caracteres.+=item,
que é ainda mais curto.