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:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
quelle
+-<>
wie Sie es gewünscht haben:a
.
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.Antworten:
CJam,
6259 BytesDanke an nhahtdh für das Speichern von 3 Bytes.
Da keine bestimmte Verteilung erforderlich ist, solange jedes No-Op mit endlicher Wahrscheinlichkeit angezeigt wird, können wir dies erheblich vereinfachen, indem wir einfach eine Zeichenfolge mit einer ausgeglichenen Anzahl von
-+
und<>
bzw. erstellen, um zu testen, ob es sich um eine NOP handelt, und sie gegebenenfalls sortieren ist nicht.Natürlich führt dies bei längeren Eingaben fast immer zu einer sortierten Ausgabe, aber Sie können den Code mit einigen Eingaben testen, um
8
zu sehen, dass er im Prinzip jede NOP mit der angegebenen Länge erzeugen kann.Probieren Sie es online aus.
quelle
CJam,
118116 BytesDies geriet etwas außer Kontrolle ... vor allem in der zweiten Hälfte scheint es, als ob es sehr golfen könnte.
Teste es hier.
Das geht so
N = 100
ziemlich sofort. Ich habe jetzt keine Zeit, die vollständige Aufschlüsselung des Codes zu schreiben. Deshalb hier der Algorithmus:<
und>
mit zufälliger (auch) Länge zwischen0
undN
einschließlich."<>><"
wird[0 '< -1 '> 0 '> 1 '< 0]
.N
.+-
an die Zeichenfolge einer zufälligen Position anhängen .Getan. Dies basiert auf der Beobachtung, dass:
<
und haben>
, um den Bandkopf in die ursprüngliche Position zurückzubringen.Indem wir zufällige, aber ausgeglichene Mengen von
+
s und-
s auf alle Stellen verteilen, an denen sich der Bandkopf auf einer bestimmten Zelle befindet, stellen wir sicher, dass wir jede mögliche NOP finden.quelle
Mathematica, 350 Bytes
Viel zu lang? Ja. Interessiert es mich überhaupt? Erst wenn jemand anderes eine gültige Antwort veröffentlicht.
quelle
+
.+
--
und<
->
Paaren , bis man ein NOP passiert zu sein. Die Hälfte davon wird von einem einfachen BF-Dolmetscher übernommen.Python 3 , 177 Bytes
Probieren Sie es online!
Ich habe Code aus Bubblers Antwort für die BF-Simulation verwendet.
quelle
Python 3 , 163 Bytes
Probieren Sie es online!
Vollständiges Programm, das die Ergebnisse an STDOUT ausgibt. Die Zeile, in der BF-Code ausgeführt wird, ist möglicherweise golfen.
Nahm Tyilos Ansatz an; Wenn der generierte BF-Code kein NOP ist, verwerfen Sie ihn vollständig und greifen Sie auf Repeat zurück
'+-'
.quelle
JavaScript (Node.js) , 160 Byte
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 224 Bytes
Probieren Sie es online!
Hier ist die Version ohne Golf (oder besser gesagt mit Pre-Golf):
Wir wählen zuerst eine Zufallszahl von
<
's und>
' s aus und generieren eine zufällige Liste mit jeweils der gleichen Anzahl.Um den Rest der Zeichen auszufüllen, wählen wir eine Position aus, an der ein Zeichen hinzugefügt werden
+
soll. Suchen Sie dann eine Position, an der der Zeiger auf dieselbe Stelle zeigt, und fügen Sie dort ein Zeichen ein-
.Wiederholen Sie diesen
n
Vorgang, bis die Liste lang ist , und fassen Sie das Ergebnis zusammen.quelle