Smallfuck ist eine Brainfuck-ähnliche Sprache mit 1-Bit-Zellen. Es hat die folgenden Anweisungen:
> 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 fügt noch eine Anweisung hinzu:
? Nondeterministically set the current bit to 0 or 1.
Ein Whatfuck-Programm nimmt keine Eingabe entgegen. Es kann zu einer von drei Möglichkeiten führen: 1(akzeptieren), 0(ablehnen) oder es kann niemals aufhören.
Das Programm führt dazu, dass 1eine für ?s ausgewählte Folge von Bits vorhanden ist, was dazu führt, dass das Programm 1als aktuelles Bit endet .
Das Programm endet mit, 0wenn alle möglichen Auswahlmöglichkeiten mit dem aktuellen Bit enden 0.
Wenn einige Auswahlmöglichkeiten nicht beendet werden und alle Auswahlmöglichkeiten damit beendet werden 0, wird das Programm niemals beendet.
Ihr Dolmetscher sollte alle Möglichkeiten gleichzeitig ausführen. Sie können es nicht 0zuerst versuchen und dann versuchen 1, da einige Programme nicht beendet werden, wenn sie sollten. *[?*]*Wird zum Beispiel mit der Auswahl akzeptieren 1, aber niemals beenden, wenn Sie immer wählen 0.
Als Beispiel ist hier ein Python 2-Interpreter, den ich geschrieben habe, nicht Golf
Regeln
Ihr Dolmetscher muss ein whatfuck-Programm von stdin akzeptieren und das Ergebnis ausdrucken.
Sie können davon ausgehen, dass das whatfuck-Programm nur Zeichen enthält
[]<>*?Das Array von Bits ist an beiden Enden unbegrenzt.
Der kürzeste Code gewinnt.
Einige Testfälle
Dies schlägt fehl, wenn Ihr Code immer 0zuerst versucht
*[?*]*
1
Gibt es eine Teilmenge, {-7,-3, 5, 8}deren Summe 3 ist?
*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1
Gibt es eine Teilmenge, {-7,-3, 5, 8}deren Summe 4 ist?
*<<<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
0
Gibt es eine Möglichkeit, boolesche Werte zuzuweisen a, bund zwar cso
(a XOR b) AND (a XOR c) AND (b XOR c) ist wahr?
?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
t+=(c=='>')-(c=='<');durcht+=c=='>';t-=c=='<';, ein weiteres durch ErsetzenB=B+[t]*(c=='*')durchB+=[t]*(c=='*')und ein drittes durch Ersetzenp+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;durchp+=1+F.get(p,0)*-~-b-R.get(p,0)*b;. Gute Antwort! (Entschuldigung, ich weiß, dass diese Antwort super alt ist!)