Einer der einfachsten Codes, der von einer Programmiersprache geschrieben wird, ist eine Programmdrucksequenz aus Zeichen (z. B. "Hallo Welt!"). Allerdings s o m e e s o t e r i c Programmiersprachen wie Brainfuck , auch dieser einfachste Code ist ziemlich ärgerlich zu schreiben.
Ihre Aufgabe ist es, ein Programm zu schreiben (muss nicht in Brainfuck geschrieben sein), das ein (minimales) Brainfuck-Programm druckt, das den angegebenen Text druckt.
Eingang
Eine Folge von Zeichen (zwischen 1
und 255
) wird durch ein beliebiges Format (Variable, Argument, stdin, Datei, ...) angegeben.
Ausgabe
Die Ausgabe ist ein gültiger (nicht übereinstimmender [
und nicht übereinstimmender ]
) Brainfuck-Code (vorausgesetzt, 8-Bit-Umbruchzelle ohne Vorzeichen und unbegrenzte Anzahl von Zellen nach links und rechts), der die genaue Zeichenfolge ausgibt, die als Eingabe angegeben wurde.
Eine mögliche Ausgabe für die Eingabe A
ist beispielsweise ++++++++[<++++++++>-]<+.
.
Das >2m
Ausführen Ihres Programms sollte nicht lange dauern ( ).
Die >10s
Ausführung des BF-Programms sollte nicht lange dauern ( ).
Wertung
(Hinweis: Die aktuelle Bewertungsmethode kann sich ändern, da die Berechnung nicht einfach ist ...)
Die Länge des Programms (Generierung von BF-Code) selbst spielt keine Rolle. Das Festcodieren von BF-Codes im Programmcode ist jedoch nicht in Ordnung. Nur akzeptablen Bereich (ex ein Code BF ein einzelnes Zeichen zu drucken. 0x01
: +.
) BF - Codes könnte hartcodiert sein.
Die Punktzahl ist die Summe der Länge der BF-Codes, die diese Zeichenfolgen drucken.
- Ein String,
Hello, world!
an den ein single0x0A
(\n
) angehängt ist (dh das Programm "Hello, world!") - Einzelzeichen von
0x01
~0xFF
- Die Summe der Länge dieser 255 BF-Codes wird mit multipliziert
1/16
, gerundet und zur Punktzahl hinzugefügt.
- Die Summe der Länge dieser 255 BF-Codes wird mit multipliziert
- Liste der ersten 16 Zeichenfolgen, die durch Aufteilen einer zufälligen Folge von Bytes generiert wurden, die am 11.11.11 durch
0x00
Entfernen aller Zeichenfolgen mit der Länge Null generiert wurden . - Lenna.png , alle
0x00
s entfernen . - Songtexte 99 Flaschen Bier , beginnend mit
99 bottles~
, Zeilenumbrüche sind0x0A
, Absätze werden durch zwei0x0A
s getrennt, und kein Zeilenumbruchszeichen am Ende. - Andere Zeichenfolgen, die Sie möglicherweise bereitstellen.
Ihr Programm kann das Berechnen der Bewertung von sich selbst enthalten.
Natürlich gewinnt der Code mit der niedrigsten Punktzahl.
Lenna.png
wird die Partitur dominieren, da es bei weitem die größte Eingabe ist. Vielleicht ein bisschen nach Größe normalisieren?Antworten:
Berechnet in Java ein kurzes BF-Snippet, das eine beliebige Zahl in eine beliebige andere Zahl umwandeln kann. Jedes Ausgangsbyte wird generiert, indem entweder das letzte Ausgangsbyte oder eine neue 0 auf dem Band transformiert wird.
Die Snippets werden auf drei Arten generiert. Zuerst durch einfache Wiederholungen von
+
und-
(zB++++
konvertiert 7 nach 11), durch Kombinieren bekannter Ausschnitte (zB wenn A 5 nach 50 konvertiert und B 50 nach 37 konvertiert, dann konvertiert AB 5 nach 37) und einfache Multiplikationen (zB[--->+++++<]
multipliziert die aktuelle Zahl mit 5/3). Die einfachen Multiplikationen nutzen den Wraparound, um ungewöhnliche Ergebnisse zu generieren (z. B.--[------->++<]>
generiert 36 aus 0, wobei die Schleife 146-mal ausgeführt wird, mit insgesamt 4 absteigenden und 1 aufsteigenden Wraparounds).Ich bin zu faul, um meine Punktzahl zu berechnen, aber es werden ungefähr 12,3 BF-Operationen pro Byte verwendet
Lenna.png
.quelle
Nun, hier ist die schlechteste mögliche Lösung, obwohl sie in Brainfuck selbst ziemlich gut aussieht:
Die Punktzahl ist wahrscheinlich die schlechteste, die wir sehen werden, ohne sie absichtlich schlecht zu machen.
Arbeit an der Berechnung der tatsächlichen Punktzahl.
quelle
+
.
[-]
die Zelle zwischen den einzelnen Zeichen zu löschen.Python 3.x
Nun, ich werde keine Preise für den kürzesten Ausgabe-Code gewinnen, aber vielleicht für das Programm, das den Code generiert ...
'Hallo Welt! \ N':
quelle
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
mit.>
Ich bin mir nicht sicher, wie gut es ist, aber ich hatte Spaß beim Schreiben. (In Clojure ...)
Es gibt wahrscheinlich effizientere und elegantere Lösungen, aber dies folgt meinem Gedankenmuster etwas linear, so dass es am einfachsten war.
quelle
Ergebnis:
478748641439404086426 (ohne zufällig generierte Daten)(4085639 davon sind von Lenna.png. Das sind 99,98%)
Ich verstehe das Teil mit den Zufallsdaten nicht. Benötige ich kein Konto, für das ich bezahlen muss, um die Daten zu erhalten?
Ziemlich naiv. Hier ist der generierte Code für "1Aa" (49, 65, 97) mit einer kleinen Dokumentation:
Der Java-Code ist ein bisschen hässlich, aber es funktioniert. Je höher der durchschnittliche Bytewert ist, desto besser ist wahrscheinlich das erzeugte Befehlsverhältnis pro Eingangsbyte.
Wenn Sie es ausführen möchten, müssen Sie Lenna.png im selben Verzeichnis wie die .class-Datei ablegen. Es druckt die Partitur auf die Konsole und schreibt den generierten BF-Code in eine Datei mit dem Namen "output.txt".
Ich werde ein paar kleine Verbesserungen vornehmen, aber wahrscheinlich nicht viel.Getan.quelle
Gehirn ** k
Ich bin ein ziemlich schlechter BF-Programmierer, daher ist diese Antwort wahrscheinlich ziemlich ineffizient. Ich bin mir nicht sicher, was die Punktzahl betrifft, aber sie sollte im Durchschnittstext etwas besser abschneiden als die vorhandene Antwort. Anstatt die Zelle nach jedem Zeichen auf Null zu setzen, "stellt" sich dieser auf ein neues Zeichen mit Subtraktion ein, wenn das vorher angegebene Zeichen größer ist.
(Beachten Sie, dass dies der Code ist, den ich vor langer Zeit geschrieben habe und der für diesen Wettbewerb neu verwendet wurde. Ich hoffe aufrichtig, dass ich die Konvertierung korrekt durchgeführt habe, aber wenn die Eingabe fehlschlägt, lassen Sie es mich wissen.)
Eine Version, die den Status des Bandes im gesamten Code anzeigt:
Generierter Code für
Hello, World!
:Dies ist meine erste Antwort auf CG.SE! Wenn ich etwas vermasselt habe, lass es mich wissen!
quelle
> <>
Ich schrieb dies als Antwort auf eine Frage, die für ein Duplikat markiert wurde, und obwohl dies nicht das beste Golfspiel ist (zumindest für diese spezielle Frage), dachte ich, dass es eine Verschwendung wäre, wenn ich es nicht teile all sein widerlicher Kauderwelsch. Wirklich, ich bin halb überrascht, dass es sogar funktioniert. Ich nehme alle Vorschläge an, um Golf zu spielen, da dies mein Hauptziel bei der Entwicklung war.
Als Randnotiz, in der zweiten Zeile
.21
könnten die ersten drei Zeichen durchv
gefolgt von zwei Leerzeichen ersetzt werden, wenn dies das Lesen erleichtert. Ich mag es nicht, Leerzeichen in meinen> <> Programmen zu sehen, weil das bedeutet, dass (buchstäblich) Platz verschwendet wird. Es ist auch ein Überbleibsel eines von vielen Prototypen.Die Funktionsweise ist sehr einfach, und ehrlich gesagt fällt es mir schwer, einen Weg zu finden, um einen anderen Algorithmus zu implementieren. Es werden jedoch viele "+" - Zeichen gedruckt, die für das erste Zeichen gedruckt werden müssen, und dann werden mehr "+" - oder "-" - Zeichen für jedes zusätzliche Zeichen gedruckt, wobei jeder Abschnitt durch Punkte getrennt wird. Was ich an dem Programm cool finde, ist, dass es seinen eigenen Quellcode so ändert, dass er "+" oder "-" ausgibt (das "+" in Zeile 3 wird durch das entsprechende Zeichen ersetzt, nachdem festgestellt wurde, ob das aktuelle Zeichen größer als oder ist weniger als die vorherige).
Ausgabe für
Hello, World!
:Ich könnte das so bewerten, wie es beabsichtigt war, aber ich bin mir fast sicher, dass ich verlieren würde, und ich weiß nicht ganz, wie man so etwas wie lenna.png in> <> liest.
Wenn diese Antwort Sie interessiert und Sie eine Erklärung wünschen, fragen Sie auf jeden Fall, aber jetzt werde ich sie ohne eine lassen, nur weil sie kurvig und kurvig ist.
EDIT 1: Es ist eine Weile her, aber ich war in der Lage, 2 Bytes mit einer fast vollständigen Überarbeitung der Art und Weise, wie das Programm entscheidet, ob ein Plus oder ein Minus gedruckt wird, abzuspielen. Es ist eine etwas enttäuschende Rückkehr für eine große Überholung, aber zumindest funktioniert es.
quelle
meine JavaScript-Lösung ist schnell und dreckig :)
Ausgabe für
Hello World\n
Quelle:
quelle
Ich habe etwas in Java gebaut. Die Punktzahl wurde nicht berechnet. Texte mit 3 oder weniger Zeichen werden mit einer Multiplikation pro Buchstabe codiert, z. B. "A" =
++++++++[>++++++++<-]>+.
. Texte mit mehr als 3 Zeichen werden mit einer berechneten Liste codiert, die in 3 Bereiche aufgeteilt ist. Der erste Bereich ist x mal 49, dann plus x mal 7 und schließlich plus x. Zum Beispiel ist "A" 1 * 49 + 2 * 7 + 2Der bereitgestellte String "### INSERT TEXT HERE ###" wird
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Hallo Welt!" wird
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
quelle
Python 3
Dies ist im Wesentlichen nur eine leicht verbesserte Version der Antwort von icedvariables. (-1 Byte von Wheat Wizard, -5 von FatalError, -2 von jez)
quelle
:
. Dies könnte wahrscheinlich auch als Listenverständnis erfolgen, um Bytes zu sparen.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
einen Generatorausdruck anstelle eines Listenverständnisses aufrufen :print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(dies verringert auch die Punktzahl, da Sie 2 Bytes in der Ausgabe verlieren)