Wenn Sie Brainfuck-Code schreiben, müssen Sie ihn manchmal länger als nötig machen, um das Debuggen zu fördern . Sie könnten es tun, indem Sie einfach einen reinstecken ><
, aber was für ein Spaß ist das? Sie brauchen etwas längeres und weniger NOPey, um jemanden zu verwirren, der Ihren Code liest.
Schnelle Einführung in Brainfuck
Brainfuck ist eine esoterische Programmiersprache, die 1993 von Urban Müller entwickelt wurde und sich durch extremen Minimalismus auszeichnet. (Wikipedia)
Brainfuck ist eine Sprache , basierend auf acht Befehle: +-><,.[]
. Der Code wird auf so etwas wie einer Turing-Maschine ausgeführt: einem unendlichen Band, auf dem Werte geändert werden können. In dieser Herausforderung konzentrieren wir uns auf die ersten vier:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
Ein Brainfuck-NOP ist eine Folge von Brainfuck-Zeichen, die, wenn sie aus einem beliebigen Zustand ausgeführt werden, zu keiner Änderung des Zustands führen. Sie bestehen aus den vier oben genannten Zeichen.
Die Herausforderung
Die Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die bei Ausführung eine zufällige Brainfuck-NOP der angegebenen Länge generiert.
Eingang
Sie erhalten als Eingabe eine nicht negative gerade Ganzzahl n
. (NOPs sind für ungerade unmöglich n
.)
Ausgabe
Sie geben eine zufällige Brainfuck-NOP der Länge aus n
.
Regeln
- Die Definition von NOP: Wenn die Ausgabe des Programms an einer beliebigen Stelle in ein Brainfuck-Programm eingefügt wird, darf sich das Verhalten des Programms in keiner Weise ändern. Mit anderen Worten, es darf den Status des Interpreters nicht ändern.
- Beachten Sie, dass dies beispielsweise
+>-<
falsch ist, da die Werte der beiden Zellen geändert werden, ohne dass sie zurückgesetzt werden. Bitte testen Sie Ihre Lösung für diese vor dem Posten. - Beachten Sie auch, dass
+>-<->+<
es sich um eine NOP handelt, die nicht einfach durch Entfernen auf Null reduziert werden kann><
<>
+-
-+
. Daher können Sie keinen Algorithmus verwenden, der diese nur ineinanderfügt.
- Beachten Sie, dass dies beispielsweise
- Jede gültige NOP der Länge
n
muss eine von Null verschiedene Chance haben, in der Ausgabe zu erscheinen. Die Verteilung muss jedoch nicht einheitlich sein. - Der fragliche Brainfuck-Interpreter hat ein doppelt unendliches Band beliebig präziser Zellen. Das heißt, Sie können unendlich in beide Richtungen gehen und jede Zelle auf unbestimmte Zeit inkrementieren / dekrementieren.
- Das Programm muss innerhalb von 1 Minute für
n
= 100 beendet sein auf meinem Computer beendet sein, damit nicht alle möglichen NOPs generiert und eine ausgewählt werden. - Bei einer ungültigen Eingabe (nicht ganzzahlig, negativ, ungerade usw.) können Sie alles tun, was Sie möchten, einschließlich Absturz.
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Beispiele
Hier sind alle gültigen Ausgaben für n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Hier sind einige mögliche Ausgaben für n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
hat eine Nebenwirkung, ,
überschreibt einen Wert, der nicht ohne die Verwendung von wiederhergestellt werden kann []
. []
Wird aber am Ende einen Wert auf Null setzen. Dadurch wird auch ein Wert überschrieben (sodass wir einen anderen Wert benötigen []
, um ihn wiederherzustellen), es sei denn, wir können sicher sein, dass die betroffene Zelle von Anfang an Null war. Wir müssten jedoch mit so etwas wie nach einer solchen Zelle suchen [>]
, und es ist unmöglich, zuverlässig zu der Position zurückzukehren, von der wir gekommen sind.
+-<>
wie Sie es gewünscht haben:a