Bewährt optimal!
((([()][()][()])))
Probieren Sie es online!
Erläuterung
Brain-Flak, Brain-Flueue, Miniflak und Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Dies druckt:
-3
-3
-3
(Es gibt eine nachgestellte Zeile)
Brain-Flak Classic
Brain-Flak Classic ist die Originalversion von Brain-Flak und weist einige wichtige Unterschiede zum modernen Brain-Flak auf. In BFC wird [...]
der Inhalt gedruckt und nicht negiert.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
Am Ende der Ausführung wird der Inhalt des Stapels ( 3 3 3
) gedruckt.
Dies druckt:
1
1
1
3
3
3
(Es gibt eine nachgestellte Zeile)
Flakcats
Flakcats ist ganz anders als die anderen 4 Flaks und ich bin überrascht, dass dies bei Flakcats funktioniert. Die drei Operatoren hier sind fast dieselben wie die, die Brain-Flak verwendet.
Der Hauptunterschied in diesem speziellen Programm zwischen Flakcats ist der (...)
Operator, der in Flakcats ([{}]...)
in Brain-Flak äquivalent ist . Dies macht jedoch keinen Unterschied für uns, da es Nullen aufnimmt und somit ähnlich funktioniert wie Brain-Flak.
Hier ist das in Brian-Flak kompilierte Programm:
([{}]([{}]([{}][()][()][()])))
Dies druckt:
-3
-3
-3
(Es gibt eine nachgestellte Zeile)
Optimalitätsnachweis in Brain-Flak und Miniflak
Dies ist kein formeller Beweis, sondern ein informeller Beweis, der erweitert werden müsste, um strenger zu werden
Aufgrund der Einschränkungen, dass Brain-Flak-Programme ein Balanced-String sein müssen und die Programmlänge ein Vielfaches von 3 sein muss, muss jede gültige Einreichung ein Vielfaches von 6 sein. Dies bedeutet, dass jede Lösung, die kleiner als 18 ist, die Länge 12 haben muss.
Aufgrund der Ausgabe in Zeilenumbrüchen muss die endgültige Höhe des Stapels ein Vielfaches von drei sein, da sonst die Ausgabeeinschränkungen verletzt werden.
Jede gültige Einreichung der Länge 12 muss zwei Arten von Klammern enthalten (weniger würde die Beschränkung der Anzahl unterschiedlicher Zeichen aufheben und mehr würde mehr als 12 Zeichen bedeuten). Da das Programm eine Ausgabe erzeugt, muss es einen Push haben.
Dies lässt uns unser anderes Set von Zahnspangen auswählen. Die Optionen sind:
<...>/<>
Dies schlägt fehl, weil wir "Wert" erzeugen müssen, um eine andere Zahl als Null zu erzeugen. Wir müssen a aufgeben ()
, um eine Eins zu erzeugen, die es unmöglich macht, mehr als zweimal zu drücken.
[...]/[]
Dies schlägt aus demselben Grund fehl, aus dem auch das letzte fehlgeschlagen ist. Die eckigen Klammern sind wirklich schlecht im Wert. Die []
Monade kann einen Wert schaffen, aber wir müssen zuerst die Zahlen drücken und dann haben wir nicht mehr genug Parens, um dreimal zu drücken.
{...}/{}
Diese ist vielversprechend, wir könnten eine Schleife erstellen und eine verwenden ()
, um mehrere Male zu pushen, aber leider ist dies nicht möglich.
Damit die Schleife endet, muss sich irgendwann eine Null auf dem Stapel befinden, und damit wir die richtige Ausgabe haben, muss sich am Ende des Programms etwas anderes als Null auf dem Stapel befinden. Da wir weder über []
noch <>
am Ende der Schleife die Null muss eine implizite Null von der Unterseite des Stapels sein. Dies bedeutet, dass die Schleife dem Stapel keine neuen Zahlen hinzufügen kann, was ihn unbrauchbar macht.
Da keine der geschweiften Klammern ein Programm der Länge 12 erstellen kann, kann keines existieren.
Da Miniflak eine Teilmenge von Brain-Flak ist, wäre jedes kürzere Miniflak-Programm auch ein kürzeres Brain-Flak-Programm und existiert daher nicht.
Brain-Flueue ist eine Scherzsprache, die auf Brain-Flak basiert. Die beiden sind sich so ähnlich, dass ihre Interpreten überall bis auf zwei Zeilen identisch sind. Der Unterschied zwischen den beiden besteht darin, dass Brain-Flueue, wie der Name schon sagt, seine Daten in Warteschlangen speichert, während Brain-Flak seine Daten in Stapeln speichert.
Zu Beginn haben wir die gleichen Einschränkungen hinsichtlich der Programmgröße, die von Brain-Flak erstellt wurde. Daher suchen wir nach einem Programm der Größe 12. Außerdem benötigen wir ein (...)
, um eine Ausgabe und ein weiteres Paar zu erstellen. Die <>
und []
-Paare funktionieren nicht in Brain-Flueue aus genau demselben Grund, aus dem sie nicht in Brain-Flak funktionieren.
Jetzt wissen wir, dass unser Programm aus den Zeichen bestehen muss ((())){{{}}}
.
Mit den gleichen Methoden wie im vorherigen Beweis können wir zeigen, dass das endgültige Programm eine Schleife enthalten muss.
Hier unterscheiden sich die Beweise, da Brain-Flueue über Warteschlangen und nicht über Stapel hinweg arbeitet und das Programm eine Schleife mit Werten in der Warteschlange verlassen kann.
Um die Schleife zu verlassen, benötigen wir eine Null in der Warteschlange (oder eine leere Warteschlange, aber wenn die Warteschlange leer ist, haben wir das gleiche Problem wie bei Brain-Flak), was bedeutet, dass wir unser Programm mit öffnen müssen ({})
, um die zu erstellen Null. Wir benötigen einen Push innerhalb der Schleife, um die erforderliche Anzahl von Elementen in die Warteschlange zu verschieben. Wir müssen auch eine Zahl ungleich Null vor die Schleife schieben, damit wir überhaupt in die Schleife eintreten können. Dies wird uns das absolute Minimum kosten (())
. Wir haben jetzt mehr Parens verwendet als wir.
Somit gibt es kein Brain-Flueue-Programm, um die 12-Byte-Aufgabe zu erledigen, und außerdem ist unser Programm dort optimal.
Die folgende Lösung ist optimal für Flakcats und Brain-Flak Classic.
((([][][])))
Erläuterung
[][][] -3
((( ))) push 3 times
Alternative 24-Byte-Brain-Flak-Lösungen
(<((<((<(())>)())>)())>)
Probieren Sie es online!
((<((<((<>)())>)())>)())
Probieren Sie es online!
((((((()()()){}){}){})))
Probieren Sie es online!