Starry ist eine witzige esoterische Programmiersprache, in der Code nur besteht, +*.,`'
wenn der tatsächliche Befehl, der durch jedes dieser Zeichen dargestellt wird, durch die Anzahl der Leerzeichen davor bestimmt wird. Das macht es sogar schwierig, Herausforderungen mit fester Ausgabe zu meistern, da unterschiedliche Befehle eine sehr unterschiedliche Anzahl von Bytes ausmachen können. Insbesondere haben Zahlenliterale eine unäre Repräsentation, die es erforderlich macht, größere Zahlen aufzubauen, indem kleinere verwendet werden.
Daher geht es bei dieser Herausforderung darum, ein Programm zu schreiben, mit dem solche Starry-Programme gespielt werden können.
Wie arbeitet Starry?
(Einige Details sind bei Esolangs nicht angegeben, daher gehe ich zum Verhalten des Ruby-Interpreters über .)
Sternenhimmel ist eine stapelbasierte Sprache mit einem einzelnen Stapel von Ganzzahlwerten mit willkürlicher Genauigkeit (der anfangs leer ist).
Die einzigen bedeutungsvollen Zeichen sind:
+*.,`'
und Räume. Alle anderen Zeichen werden ignoriert. Jede Folge von Leerzeichen, gefolgt von einem dieser Nicht-Leerzeichen, repräsentiert eine einzelne Anweisung. Die Art der Anweisung hängt vom Nicht-Leerzeichen und der Anzahl der Leerzeichen ab.
Die Anweisungen sind:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Beachten Sie, dass der Interpreter den Quellcode vor Beginn der Ausführung nach den Labels durchsucht, sodass sowohl vorwärts als auch rückwärts gesprungen werden kann.
Natürlich hat Starry auch Eingabebefehle ( ,
analog zu .
), aber diese sind für diese Herausforderung irrelevant.
Die Herausforderung
Generieren Sie mit einer gegebenen Zeichenfolge ein Starry-Programm, das keine Eingabe annimmt und die Zeichenfolge genau an STDOUT ausgibt.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie können davon ausgehen, dass die Zeichenfolge nicht länger als 128 Zeichen ist und nur aus druckbaren ASCII-Zeichen besteht (Codepunkte 0x20 bis 0x7E).
Ihre Lösung sollte solche Eingaben auf einem vernünftigen Desktop-Computer in weniger als 5 Minuten verarbeiten (es gibt einen gewissen Spielraum dafür; wenn es auf meinem Laptop ein paar Minuten länger dauert, macht es mir nichts aus, aber wenn es 15 Minuten dauert, werde ich disqualifizieren es).
Ihre Lösung wird anhand einer Reihe von unten aufgeführten Zeichenfolgen getestet. Ihre Punktzahl ist die Gesamtbytezahl der entsprechenden Starry-Programme. Bei einem Gleichstand gewinnt der kürzeste Metagolfer. Das heißt, spielen Sie nicht Ihren eigenen Code, es sei denn, es gibt ein Unentschieden (was meines Erachtens nur passieren wird, wenn eine optimale Lösung möglich ist).
Sie dürfen Ihren Code nicht für die unten aufgeführten spezifischen Testfälle optimieren. Insbesondere sollten Sie keine handgefertigten Lösungen für sie fest programmieren. Die Optimierung für Zeichenfolgenklassen, deren Struktur der der angegebenen Zeichenfolgen ähnelt, ist in Ordnung. Bei Verdacht auf Hardcoding-Lösungen behalte ich mir das Recht vor, einige oder alle Testfälle (durch Zeichenfolgen vergleichbarer Strukturen) zu ersetzen.
Testfälle
Jede Zeile ist ein eigener Testfall:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
Credits für den zweiten Testfall gehen an Dennis . Credits für den vierten Testfall gehen an Sp3000.
Referenzlösung
Hier ist eine wirklich grundlegende Referenzlösung in CJam:
q{S5*\iS*'+S'.}%
Sie können es hier für die gesamte Testsuite ausführen. Die Ergebnisse sind:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
Dies ist die einfachste Methode: Verschieben Sie den Codepunkt jedes Zeichens als Literal und drucken Sie ihn dann aus. Es werden keine kleinen Unterschiede zwischen aufeinanderfolgenden Zeichen, Ganzzahldrucken, sich wiederholenden Teilen der Zeichenfolge usw. verwendet. Diese Dinge überlasse ich Ihnen.
Ich glaube, es gibt viel Raum für Verbesserungen. Als Referenz die kürzeste handgefertigte "Hallo, Welt!" ist nur 169 Bytes lang.