Ganzzahlen sind mühsam in Brain-Flak darzustellen . Es gibt 8 Betreiber:
() Evaluates to 1, but does not push anything on any stack
[] Evaluates to an indeterminate value for the purposes of this question
{} Removes the top of the stack and evaluates to it
<> Switches to or back from the alternate stack and evaluates to zero
(foo) Pushes the value of the expression foo to the stack and evaluates to it
[foo] Evaluates to the negation of foo
{foo} Evaluates the expression foo until the top of the stack is zero
<foo> Evaluates to zero but executes foo anyway
foo
kann aus mehreren Operatoren bestehen. In diesem Fall werden sie ausgewertet und summiert. Zum Beispiel (()())
drückt 2
auf den Stapel (und wertet 2
auch aus).
Offensichtlich ist der (()...())
Mechanismus in Code Golf nicht nützlich, da große Zahlen n*2+2
zur Darstellung Bytes benötigen würden . Ihre Herausforderung besteht daher darin, ein Programm oder eine Funktion zu schreiben, die in möglichst wenigen Bytes ein Brain-Flak-Programm ausgibt, das eine bestimmte positive Ganzzahl n
auf den aktiven Stapel überträgt. Dieses Programm darf keine Annahmen über den vorhandenen Inhalt der Stapel machen, darf also die Stapel nicht austauschen oder zusätzliche Werte zu den Stapeln hinzufügen oder daraus entfernen.
Obwohl Ihr Programm oder Ihre Funktion in der Lage sein muss, ein funktionierendes Brain-Flak-Programm für alle Eingaben von 1 bis 1.000.000 zurückzugeben, ist der Gewinner das Programm oder die Funktion, die den kleinsten Satz geeigneter Brain-Flak-Programme für alle 1061 Primzahlen zwischen 1.000 und 1.000 generiert 10.000 . Sie sollten die Gesamtgröße Ihrer Ausgaben für diese 1061 Eingaben als Teil Ihrer Einreichung notieren. Ihr Programm oder Ihre Funktion akzeptiert möglicherweise die Ganzzahl und gibt das (Zeichenfolge-) Brain-Flak-Programm in einem der üblichen zulässigen E / A-Formate zurück. Krawatten werden anhand der Größe Ihres Programms oder Ihrer Funktion getrennt.
quelle
2n
ist4^n catalan(n)
.(()()()...())
. Wenn Sie nur Primzahlen verwenden, werden möglicherweise einige Optimierungen für Verbundwerkstoffe verpasst.[]
für diese Herausforderung undefiniert? Ich finde es seltsam, 7 der 8 Operatoren zu implementieren. Wie auch immer, coole Herausforderung, ich fühle mich geehrt, dass jemand eine Herausforderung schreibt, die von meiner eigenen Sprache inspiriert ist![]
in ihrer Antwort auf einen bestimmten Wert von verlassen .Antworten:
Python 2,
593945924458534584165839458250Ok hier ist meine Lösung.
Die relevante Funktion ist
push(n)
. Um es aufzurufen, drücken Sie einfach auf die Ganzzahl, die Sie darstellen möchten.Erläuterung
Die Hauptoptimierung, die das Programm durchführt, ist die Multiplikations-Hardcodierung. Die Idee der Multiplikations-Hardcodierung ist ziemlich einfach. Sie drücken die a-Zahl und dann Pop und Push, um einen neuen Wert zu erstellen. Um beispielsweise mit zwei zu multiplizieren, können Sie den folgenden Code verwenden,
((n){})
wobei n Code eine bestimmte Zahl erzeugt. Dies funktioniert, weil beide(n)
und{}
einen Wert von n haben.Diese einfache Idee kann für größere Zahlen komplexer gestaltet werden. Nehmen wir zum Beispiel 5, es wurde vor einiger Zeit entdeckt, dass der beste Weg, um mit fünf zu multiplizieren, war
(((n)){}){}{}
. Dieser Code erstellt zwei Kopien von n, multipliziert eins mit 4 und addiert die beiden. Mit der gleichen Strategie mache ich jede Multiplikation basierend auf der Binärdarstellung einer Zahl. Ich werde jetzt nicht näher darauf eingehen, wie das funktioniert, aber ich mache das, indem ich die erste der binären Darstellung abhacke und 0 durch){}
und 1 durch ersetze){}{}
. Es stellt dann sicher, dass n die entsprechende Anzahl von Malen verschoben wird, und gleicht alle Klammern aus. (Wenn Sie wissen möchten, wie das gemacht wird, können Sie sich meinen Code ansehen). Wenn Sie wissen möchten, warum dies funktioniert, fragen Sie mich einfach in einem Kommentar. Ich glaube nicht, dass irgendjemand wirklich alle Aktualisierungen meines Beitrags liest, deshalb habe ich die Erklärung weggelassen.Wenn der Algorithmus versucht, einen Multiplikations-Hardcode zu finden, versucht er alle Primfaktoren einer Zahl. Sie ignoriert zusammengesetzte Faktoren, da zusammengesetzte Faktoren an einer Stelle immer prägnanter ausgedrückt werden könnten als ihre eigenen Primfaktoren. Es ist nicht bekannt, ob dies immer noch zutrifft.
Der andere Byte-Speichermechanismus ist ein Polynomlösungsfinder. Es gibt bestimmte Formen von Polynomen, die sich mit dekrementierenden Schleifen leicht darstellen lassen. Diese Polynome umfassen, ohne darauf beschränkt zu sein, polygonale Zahlen. Diese Optimierung findet Polynome, die in das Formular passen, und erstellt den Code, mit dem sie erstellt werden.
Ausgabe
Paste-Bin
quelle
n
größer oder kleiner ist alsn+1
if n % 3 == 2:
bis zum Ende dieser Funktion um eine Ebene aufheben .Brain-Flak, 64664
Probieren Sie es online!
Hier ist mein kommentierter Code
Erläuterung
Dies implementiert ab sofort nur zwei Regeln:
Wenn n durch zwei teilbar ist, wird zurückgegeben
(n/2){}
Wenn n nicht durch zwei teilbar ist, wird zurückgegeben
n-1()
Außerdem werden alle Zahlen kleiner als 6 hartcodiert.
quelle
Perl,
592225915658460 Zeichenn()
(11322660 Zeichen)(n){}()
(64664 Zeichen)((n)){}{}
(63610 Zeichen)((n)()){}{}
(63484 Zeichen) - Dies ist eine neuartige Berechnung(n){({}[()])}{}
(60748 Zeichen)n[m]
(62800 Zeichen)(n){m({}[l])}{}
(58460 Zeichen) - Dies ist eine neuartige BerechnungDie Formel für diese letzte Berechnung lautet
n(n/l+1)/2+mn/l
. Ich habe einige andere Berechnungen versucht, aber sie sind für die angegebene Ausgabe nicht mehr hilfreich. Das Programm generiert tatsächlich alle Werte bis 9999, listet dann aber die angegebenen Primzahlen und deren Gesamtlänge auf.quelle
&try($i * $i, "$numbers[$i]{({})({}[()])}{}");
, was zu 58032 hinuntergeht, wenn ich auch hinzufüge&try((3 * $i * $i - $i) / 2, "$numbers[$i]{({})({}[()])({})}{}");
(quadratische / fünfeckige Zahlen) - es ist von hierPython,
5913658676 ZeichenBrainflak Nummer Golffunktion:
Primzahl-Iteration:
Ausgabe:
Pastebin
Erläuterung:
Wir füllen eine Liste R der Brain-Flak-Repräsentation vor, die einzelne ganze Zahlen über einen größeren als den erforderlichen Bereich [1, m -1] auswertet , um unsere Funktion f zu definieren . Die Darstellungen werden gebildet, indem die niedrigste unbenutzte Darstellung (mit l indiziert ) genommen und viele neue Darstellungen daraus gebildet werden, wobei nur die kürzeste beibehalten wird. Die niedrigste ungenutzte Darstellung setzt voraus , dass alle Nummer 1 bis l eine Darstellung zugeordnet wurde und daß diese Darstellungen sind bereits verwendet worden , um neue Zahlen zu erzeugen. Wenn ein Wert kleiner als l eine kürzere Darstellung erhält, müssen wir zurückgehen und Zahlen reproduzieren, die an diesem Punkt beginnen. Die Funktion f Erzeugt ein Programm, das die Nummer durch Hinzufügen von Klammern im Stapel speichert.
Ich kannte keinen Brainflak, als ich damit anfing, und ich schätze die Antwort von Eamon Olive sehr, dass er die Formel für Dreieckszahlen aufgezeigt hat. Meistens habe ich die Summe verallgemeinert und mich unerbittlich darum gekümmert, Summen und Differenzen zu überprüfen. Das Hinzufügen vieler Vielfacher von Summen hatte einen großen Effekt.
Für diejenigen, die sich interessieren, ist hier der Scratch-Code, mit dem ich herausgefunden habe, welche Formeln sich gelohnt haben.
Darstellungsformeln:
(X){}
((X)){}{}
((((X)))){}{}{}{}
((((((X)))))){}{}{}{}{}{}
XY
X[Y]
(X){({}[Y])}{}
(X)({({}[Y])}{}){}
(X)(({({}[Y])}{})){}{}
(X)(({({}[Y])}{}){}){}
etc ...
quelle
Lua 5,3, 57522
Ich habe tatsächlich angefangen, daran zu arbeiten, als die Frage veröffentlicht wurde, habe sie aber bis zum Brain-Flak-Jubiläum vergessen.
Eine ähnliche Idee wie bei den anderen Antworten, bei denen bekanntermaßen nützliche Funktionen zum Aufbau größerer Zahlen aus guten Darstellungen einfacherer Zahlen verwendet werden.
Ein Unterschied besteht darin, dass ich Teilprobleme nicht in Form kleinerer Zahlen, sondern in Form von Zahlen mit kürzeren Darstellungen löse. Ich denke, dies macht es eleganter, negative Zahlen zu nutzen und den Fall zu behandeln, in dem kleinere Zahlen als größere Zahlen dargestellt werden.
Der Versuch, alle Zahlen zu finden, die in einer bestimmten Größe dargestellt werden können, und der Versuch, eine bestimmte Zahl so kurz wie möglich darzustellen, vereinfacht tatsächlich bestimmte Berechnungen. Anstatt eine Formel in umgekehrter Reihenfolge zu bearbeiten, um festzustellen, ob sie auf eine Zahl angewendet werden kann, kann die Formel vorwärts bearbeitet und auf jede Zahl angewendet werden.
Ein weiterer Unterschied besteht darin, dass bekannte Lösungen in zwei Teilen gespeichert werden - einem (optionalen) "Präfix" und einem "Suffix" (eher wie ein Infix). Es wird erwartet, dass die Bewertung des Präfixes bei der Berechnung der angegebenen Zahl ignoriert wird. Das Präfix enthält lediglich Code, der das auszuführende Suffix festlegt (in der Regel durch Verschieben eines oder mehrerer Elemente in den Stapel). So kann mit einem Präfix und einem Suffix die entsprechende Nummer auf den Stapel geschoben werden
prefix(suffix)
.Diese Aufteilung löst im Grunde das gleiche Problem wie die
unpack
Funktion in der Antwort des Weizen-Assistenten. Anstatt Code<...>
nur umzubrechen, um dies später rückgängig zu machen, wird dieser Code einfach zum Präfix hinzugefügt.In einigen Fällen wird das Präfix tatsächlich ausgewertet (hauptsächlich für die Pseudoexponentierungsoperation), sodass seine Bewertung ebenfalls gespeichert wird. Dies ist jedoch kein großes Problem, da der Generator nicht versucht, bestimmte Zahlen zu konstruieren. Es scheint theoretisch zu implizieren, dass es zwei Codeteile mit der gleichen Länge und der gleichen Anzahl geben könnte, die aufgrund unterschiedlicher Präfixbewertungen nicht redundant im Cache wären. Ich habe mich jedoch nicht darum gekümmert, das zu berücksichtigen, da es (zumindest in diesem Bereich) nicht sehr wichtig zu sein scheint.
Ich stelle mir vor, es wäre einfach, die Byteanzahl durch Hinzufügen weiterer Fälle zu verringern, aber ich habe im Moment genug.
Ich bin auf 1000000 gelaufen, habe aber nur die Vernunft auf 100000 überprüft.
Pastebin der Ausgabe für gegebene Primzahlen.
quelle
k_limit
undk_max_len
tun? Ich bin nicht sicher, ob ich den Header verstehe.k_max_len
. Es konnte genauso leicht überprüft werden, ob alle von Ihnen nach der Verarbeitung der einzelnen Längen angeforderten Zahlen gefunden wurden, aber es war für mich hilfreich, die maximale Länge während des Tests einschränken zu können, damit das Programm schneller ausgeführt werden konnte. (Das Verarbeiten größerer Längen kann sehr langsam sein.)k_limit
Dies ist im Grunde der Eingabeparameter - er gibt Programme für Zahlen bis zu diesem Wert aus - vorausgesetzt, er istk_max_len
groß genug, um sie zu finden.Rubin, 60246 Bytes
Ich benutze einen Hash. Ich finde den besten Golf für eine gegebene Zahl und benutze die kleineren, um die größeren zu finden.
Rekursive Hashes machen so viel Spaß!
quelle
Python, 64014 Zeichen
Ich wusste vor dieser Herausforderung nichts über Brainflak und habe nur ein bisschen an Tryitonline herumgespielt, sodass es offensichtliche Abkürzungen geben könnte, die ich verpasst habe. Dies ist eine recht langweilige Lösung, bei der nur die Eingabe in
x=x/2+x%2
oder aufgeteilt wirdx=x/3+x%3
, je nachdem, welcher Wert kürzer ist.Nenne es so:
b(42)
Ausgabe auf Pastebin
quelle
Lua, 64664 Bytes
Programm druckt die Gesamtlänge der Programme und des Programms für die 203. Primzahl (es gibt eine Zeile, die Sie ändern können, um die zu druckende Zeile zu ändern, oder eine Zeile aus dem Kommentar entfernen, um alle Programme zu drucken).
Im Moment ist die einzige Optimierung x = 2 * n + 1
Hoffentlich habe ich Zeit, weitere Optimierungen hinzuzufügen, um die Punktzahl zu senken.
quelle