Kubisch ist zu mühsam, um Code manuell . Ihre Herausforderung besteht darin, ASCII-Text in Cubically-Quellcode zu übersetzen.
Kubisch
Dies ist nur ein kurzer Überblick über Cubically. das Repository enthält eine ausführlichere Anleitung und Details.
Cubically ist ein Esolang, den ich vor einiger Zeit geschrieben habe und dessen Gebrauch schmerzhaft ist. Es enthält zwei Speicher, einen 3x3x3 Rubik's Cube und ein Register, das als "Notizblock" bezeichnet wird.
Erinnerung
Der interne Zauberwürfel wird folgendermaßen initialisiert:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Nach einer 90 ° -Drehung im Uhrzeigersinn auf der rechten Seite sieht der Speicherwürfel folgendermaßen aus:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Befehle
Ein nicht ganzzahliges Zeichen legt den Standardbefehl fest. Für jede Ganzzahl, bevor der Standardbefehl erneut festgelegt wird, wird der Befehl mit dieser Ganzzahl ausgeführt. Zum Beispiel x524y312
würde Befehl x
mit 5, dann mit 2, dann mit 4, dann Befehl y
mit 3, dann mit 1, dann mit 2 ausführen .
Die von den Befehlen verwendeten Ganzzahlen repräsentieren Flächenindizes. So funktionieren x0
würde x
auf dem UP (0 indiziert) Gesicht. x1
würde durchführenx
auf der linken (1-indizierten) Seite auftreten und so weiter.
Wenn Sie einen Befehl mit 6
ausführen, wird dieser Befehl für den Notizblockwert ausgeführt. Das Ausführen eines Befehls mit einer Ganzzahl über 6 führt zu einem Fehler.
Hier sind einige Beispielbefehle:
R1
- Drehen Sie die RECHTE Seite im Uhrzeigersinn um 90 °, damit der interne Würfel wie im zweiten Beispiel oben aussiehtR11
- Das RECHTE Gesicht zweimal um 90 ° im Uhrzeigersinn drehen, identisch mitR2
+0
- Fügen Sie alle Werte des UP-Gesichts zum Notizblock hinzu+000
- Fügen Sie alle Werte des UP-Gesichts dreimal zum Notizblock hinzu@6
- Drucken Sie das nicht vorhandene 6. indizierte Gesicht (Gedächtnis) als Zeichen%4
- Die Summe aller Werte auf der BACK-Seite als Ganzzahl ausgeben
Eine vollständige Liste der Befehle und der Syntax finden Sie im Repository .
Herausforderung
Sie nehmen ASCII-Text als Eingabe und drucken ein kubisches Programm als Ausgabe.
Beispiele (von hier und hier gestohlen ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Regeln
- Ihr Programm enthält möglicherweise kein Wörterbuch mit den Übersetzungen für die 100 Testfälle.
- Ihr Programm muss in weniger als 180 Sekunden beendet sein (keine Brute-Force-Programme, die Wochen dauern).
- Ihr Programm muss gültigen kubischen Code ausgeben, der in weniger als 180 Sekunden beendet ist.
- Ihr Programm nimmt Eingaben über die Standardeingabe entgegen, es sei denn, Sie möchten sich mit dem Testtreiber anlegen.
- Ihr Programm muss kubischen Code ausgeben, der beim Ausführen nur die Eingabe Ihres Programms erzeugt. ಠ_ಠ
Wertung
Sie testen Ihr Programm mit 100 pseudozufälligen Zeichenfolgen von pseudozufälliger Länge. (Ein Bash-Skript wird mitgeliefert, das dies für Sie erledigt.) So werden Sie punkten:
- Die Länge des Ausgabeprogramms sei o .
- Die Länge der Eingabezeichenfolge sei l .
- Sei eine Variable r das Ergebnis von o / l .
- Finde den Durchschnitt aller r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Testen Sie mit diesem Skript. Sie müssen es wie angewiesen ändern. Beachten Sie, dass das Programm nicht überprüft, ob die Ausgabe gültigen kubischen Code enthält. Wenn Sie das Skript nicht zum Laufen bringen können, kann ich Ihnen helfen. Ping mich in den kubischen Chatraum .
quelle
@6
- die Summe des nicht vorhandenen sechsten indizierten Gesichts (Notizblock) als Zeichen drucken" genauer? Ist%4
auch eine Summe? Sind+
Befehle Summenfläche, die dann zu allen Werten addieren oder ...?@6
/%6
druckt den Notizblockwert direkt als Zeichen / Ganzzahl.@x
/%x
(wobei x für eine vorhandene Fläche steht) fügt alle Werte derx
indizierten Fläche hinzu und gibt die Summe als Zeichen / Ganzzahl aus.+
Fügt alle Werte auf dem angegebenen Gesicht zum Register hinzu.Antworten:
C ++ 11, Score : 6,37
Probieren Sie es online! (Kubisch Code aus ASCII generieren) und (Kubisch Code ausführen)
Erläuterung:
{0,9,18,27,36,45}
bis gebildet wird{6, 15, 27, 26, 19, 42}
. Was diese Gesichtssummenmenge nützlich macht, ist, dass der gcd 1 ist, so dass es nach Bézouts Identität eine Möglichkeit gibt, eine beliebige Zahld
aus einer Summe (oder Differenz) dieser Zahlen zu konstruieren .ch
und der aktuelle Notizblockwert istn
,d = ch - n
können wir Cubically-Befehle in der Form ausführen,+{digits from 0 to 5}-{digits from 0 to 5}
dass der Notizblockwert wirdch
. Dann einfach ausführen%6
, um den Notizblockwert zu drucken.d
eine Summe / Differenz von Zahlen im Gesichtssummensatz auszudrücken , verwende ich den Knapsack-Algorithmus für alle Zahlen von 0 bis 128. Beispielsweised=1
wird das Programm27 - 26 = 1
so, wie es gedruckt wird+2-3
, das heißt27 - 26 = 1
. Was sich beim Ausführen des Programms mit Eingabe zeigtabc
, ist die Programmausgabequelle
@
implizites Aufrufen erzielen@6
können - kann@
in jedem Fall auf verkürzt werden.Lua, Score :
85,9113,5013,2012,709,419,329,839,669,129,068,03 (Durchschnitt)Probieren Sie es online!
Okay, ich glaube nicht, dass ich das noch optimieren kann.
Diese Version durchläuft jedes Zeichen, addiert dabei c% 9 (wobei c der Dezimalwert des Zeichens ist)
:5+2/1
und addiert dann die durch 9 teilbaren Teile, indem der Wert dieser Fläche addiert wird. Beispiel::2/1+551@
Zum Drucken von "e" wird:2/1
2+551
hinzugefügt, 99 (9 * (5 + 5 + 1) oder 9 * 11)@
hinzugefügt und die Ausgabe gedruckt. Eingabe wird mit gelesenio.read()
.Zu den Optimierungen gehört das direkte Addieren / Subtrahieren nach dem Drucken, wenn der Unterschied zwischen den Zeichen ein Vielfaches von 9 ist, das Teilen des aktuellen Werts, sofern dies möglich ist, anstatt c% 9 von Grund auf neu festzulegen, und das Wiederholen der Zeichen, indem der aktuelle Wert erneut gedruckt und nicht neu berechnet wird. Zusätzlich habe ich die Methode von Kamil implementiert, mit der sofort jedes Gesicht gedruckt wird, das bereits den Zielwert enthält, sowie den Vorschlag von MD XF, nicht
:
am Anfang zu verwenden, sondern nur mit einem zu beginnen+
.quelle
local inp = io.read()
zulocal inp = io.read("*all")
. Das behebt das Problem.:5+124
sondern können einfach nur schreiben+5124
, wodurch sich die Punktzahl wahrscheinlich ein wenig verringert, wenn Sie sie richtig einstellen.Kubisch , Ergebnis : 86,98
Probieren Sie es online!
Es hat sich herausgestellt, dass Sie lediglich bedingte Schleifen, eine Fläche von 1 und ein konsistentes Verhalten am Ende der Eingabe benötigen.
Das Addieren / Subtrahieren der LINKEN Fläche bewirkt, dass die Schleife endet, wenn EOF gelesen wird.
quelle
@
implizites Aufrufen erzielen@6
können - kann@
in jedem Fall auf verkürzt werden.C # (.NET Core) , Score:
129,9811,7310,829,6210,3310,3210,20-1,2 Punkte nach dem Vorschlag von MD XF
@6666...
anstelle von@6@6@6@6...
wiederholten Zeichens eine überlegene Initialisierungssequenz zu verwendenProbieren Sie es online!
Meine neueste Version manipuliert tatsächlich den Würfel! Yay!
Als erstes
Console.Write
gibt es eine feste Manipulation, die MD XF ausgearbeitet hat und die diesen Würfel erzeugt:Die Bedeutung dieses Würfels besteht darin, dass eine seiner Seiten eine Summe von 1 hat, was Manipulationen des Notizblocks in einem kleineren Maßstab als ein Vielfaches von neun erlaubt, und insbesondere die Relativbewegung vereinfacht, anstatt dass jedes Zeichen bei Null beginnen muss; In diesem Algorithmus werden sowohl Addition als auch Subtraktion verwendet, um den kürzesten Weg zwischen Zeichen zu nehmen.
Die Version der Initialisierung von MD XF bewirkt, dass Seite 2 eine Summe von 14 aufweist, wodurch viele Bytes an Ausgabe für ASCII-Abstände zwischen 14 und 20 gespart werden.
Jetzt können Eingaben mit internen Zeilenumbrüchen verarbeitet werden. Console.Read () erhält einzelne Zeichen bis zum Ende der Datei. Siehe den TIO-Link, der den Eingang haben soll
Rasiert ein paar Bruchteile eines Punktes, indem sofort ein Zeichen ausgegeben wird, wenn sein ASCII-Wert zufällig bereits auf einer Seite vorhanden ist.
Test Script mit freundlicher Genehmigung von MDXF
Vorherige Einreichung hier und Erläuterung:
Das ist ein bisschen langweilig, aber soweit ich das beurteilen kann, funktioniert es. Zugegeben, ich habe es nur versucht
Hello, World!
aber ich habe die Ausgabe im TIO Cubically Interpreter ausgeführt und es wurde "Hello, World!" also nahm ich an, dass es funktioniert.Anstatt den Würfel tatsächlich zu manipulieren, wird der Notizblock einfach wiederholt um die Summe der 1 Fläche (9) erhöht, bis er den richtigen Wert für jedes Zeichen hat, und dann gedruckt.
quelle