Ihre Herausforderung besteht darin, den Brainfuck- Code gemäß diesen Regeln zu minimieren :
- Entfernen Sie alles, was nicht dazu gehört
+-><[].,
. - Wenn die Anzahl von s und s für eine Gruppe von aufeinanderfolgenden Zeichen
+
oder-
Zeichen gleich ist, entfernen Sie sie.+
-
- Machen Sie dasselbe wie oben, aber mit
>
und<
. - Entfernen Sie die
+-><
Zeichenfolgen, wenn Sie nichts tun. Zum Beispiel sollten Sie entfernen+>-<->+<
. (Dies kann die schwierigste und schwierigste Implementierung sein.) Stellen Sie sicher, dass Sie keine falsch positiven Ergebnisse erhalten+>-<+>-<
, die nicht entfernt werden sollten.
Testfälle:
Eingang
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Ausgabe
++++++[->++++++<]>.[-],[>,]<[.<]
Eingang
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Ausgabe
+++>-<+>---<
Sie können Eingaben und Ausgaben akzeptieren, wie Sie möchten - stdin / stdout, eine Funktion usw., aber die Eingaben sind möglicherweise nicht fest codiert.
Dies ist Code-Golf , also gewinnt der kürzeste Code in der Anzahl der Zeichen.
++>>++<<--
sollte ausgeben>>++<<
, und das wurde nicht abgedeckt. Bitte fügen Sie weitere Testfälle hinzu.+++>-<+>---<
? Sie kann verkürzt werden, um unnötige Zeigerbewegungen zu vermeiden. Die erwartete Ausgabe lässt sie jedoch unverändert. Mein Verständnis basiert darauf, sowohl die Frage als auch die Antworten zu betrachten, dass Doorknob cool ist, wenn die Spezifikation locker genommen wird; Wir müssen alle zusammenhängenden No-Op-+-><
Sequenzen entfernen, wie explizit angegeben, und darüber hinaus ist es zulässig, zusätzliche Minimierungen wie in Ihrem Beispiel vorzunehmen.++>>++<<--
Wir können auch Neuanordnungen vornehmen, solange sie die Funktionalität des Codes nicht ändern, z. B.>+<+
in+>+<
.+>-<->+<
. (Dies ist möglicherweise die schwierigste und schwierigste Implementierung.) Stellen Sie sicher, dass Sie keine falsch positiven Ergebnisse erhalten+>-<+>-<
, z. was nicht entfernt werden sollte. " - das ist irgendwie vageAntworten:
REBEL - 104
Verwendung:
Eingabe: Liest eine Zeile von stdin.
Ausgabe: Druckt eine Zeile auf Standardausgabe.
Anomalien *:
_
bewirkt, dass eine andere Zeile gelesen und verwendet wird, anstatt nichts auszugeben.++++>----<
statt+++>-<+>---<
. Aber das ist in Ordnung, oder? ;)>-<+
etc. werden ersetzt durch+>-<
etc.Spoiler:
* Es ist kein Fehler, es ist ein Feature!
quelle
Brainfuck, 579 Bytes
Mit Formatierung und einigen Kommentaren:
Dies erfolgt nach dem gleichen Ansatz wie bei Keith Randalls Lösung, bei dem alle aufeinander folgenden Sequenzen
+-<>
durch Simulation optimal minimiert werden. Zum Beispiel+++>-<+>---<
wird++++>----<
und>+<+<<+>+<->>>>
wird+<+>>+>
.Probieren Sie es online aus. (Wenn sich der Absolutwert einer simulierten Zelle 256 nähert, treten Überlaufprobleme auf.)
Die Gesamtstruktur ist
Das Band ist in 7-Zellen-Knoten unterteilt. am anfang der inneren schleife befindet sich das speicherlayout
0 s 0 c 0 a b
Dabei
s
ist ein Boolesches Flag für die Startzellec
das aktuelle Zeichen,a
der negative Teil des simulierten Zellenwerts (plus eins) undb
der positive Teil des simulierten Zellenwerts.Wenn die verkleinerte Sequenz gedruckt wird, lautet das Speicherlayout
d n e 0 0 a b
woher
d
ist ein Boolesches Flag für Richtunga
undb
sind wie zuvor (werden aber eins / null, wenn gedruckt), undn
unde
sind nur ungleich Null für den Endknoten;n
hängt davon ab, wie oft der Knoten gesehen wurde, unde
ist der Wert des Zeichens, das die innere Schleife angehalten hat (plus eins).Ursprünglich dachte ich darüber nach, mehr Informationen pro Knoten zu erfassen: linker und rechter Knoten als Boolesche Flags und die Position des Knotens in Bezug auf den Start- und Endknoten. Wir können dies jedoch vermeiden, indem wir bei Bedarf auf benachbarte Zellen schauen und nach links und rechts scannen, um den Startknoten zu finden.
Wenn wir die verkleinerte Sequenz drucken und entscheiden, wie der simulierte Zeiger bewegt werden soll, können wir einen allgemeinen Ansatz verfolgen: Beginnen Sie, indem Sie sich vom Endknoten wegbewegen (in einer beliebigen Richtung, wenn Start- und Endknoten gleich sind), und drehen Sie sich ganz links und ganz rechts herum Knoten und Stopp basierend auf der Häufigkeit, mit der der Endknoten gesehen wurde: 3 Mal, wenn Start- und Endknoten identisch sind, andernfalls 2 Mal.
quelle
Python, 404 Zeichen
Dieser Code optimiert alle Teilsequenzen von
+-<>
. Ein bisschen mehr, als Sie verlangt haben, aber los geht's.Dies funktioniert durch Simulieren der
+-<>
Vorgänge auf dem Bandt
.s
ist die Startposition auf dem Band undp
ist die aktuelle Position. Nach der Simulation wird der Umfang ermittelt[a,b]
, der bearbeitet werden muss, und alle +/- in einem optimalen Durchgang ausgeführt.quelle
CoffeeScript -
403397Demo (bitte verzeihen Sie die Verwendung von bit.ly hier, die gesamte URL würde die Markierung aufheben)
Unkomprimierte Version (mit Debug-Code):
quelle
>+.-<
und erzeugt die leere Zeichenfolge, anstatt sie unverändert zu lassen.