Diese Frage basiert auf dem, was ich mir ausgedacht habe , um eine andere Frage zu beantworten .
Manchmal stellen die Fragen hier das Zeichnen von ASCII-Kunst. Eine einfache Möglichkeit, die Daten für die Technik zu speichern, ist RLE (Run-Length-Codierung) . Damit:
qqqwwwwweeerrrrrtttyyyy
wird:
3q5w3e5r3t4y
Um nun eine große ASCII-Grafik zu zeichnen, erhalten Sie möglicherweise Daten wie diese (ohne Berücksichtigung der neuen Zeilenzeichen):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
Die für die ASCII-Grafik verwendeten Zeichen sind niemals Klein- oder Großbuchstaben oder Zahlen, sondern nur Zeichen, Markierungen und Symbole, sondern immer im druckbaren ASCII-Zeichensatz.
Sie möchten etwas Platz in dieser Zeichenfolge sparen, also ersetzen Sie die Zahlen durch den Großbuchstaben ('A' entspricht 1, 'B' entspricht 2, bis 'Z' 26 entspricht), da Sie dies niemals tun werden Erhalte mehr als 26 Wiederholungen eines Charakters. So bekommen Sie:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
Und schließlich bemerken Sie, dass sich einige Gruppen von (Buchstabe + Symbol) wiederholen. Ersetzen Sie daher die Gruppen, die dreimal oder öfter in der Zeichenfolge erscheinen, durch den Kleinbuchstaben-Zeichensatz, in der Reihenfolge oder im Erscheinungsbild der Zeichenfolge, speichern Sie jedoch die in einem Puffer Ersetzungen vorgenommen (im Format "Gruppe + Ersetzungszeichen" für jede Ersetzung) und den Rest der Zeichenfolge unverändert lassen. Also die folgenden Gruppen:
S, (3 times)
T (4 times)
K@ (3 times)
wird durch 'a', 'b' bzw. 'c' ersetzt, da sich nie mehr als 26 Gruppen wiederholen werden. So endlich bekommen Sie:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Der letzte Schritt spart nur 1 Byte, da die Gruppen, die nach dem Ersetzen tatsächlich Zeichen speichern, viermal oder öfter angezeigt werden.]
Die Herausforderung
Schreiben Sie bei einer Zeichenfolge mit den RLE-Daten zum Zeichnen einer ASCII-Grafik (mit den vorgeschlagenen Einschränkungen) das kürzeste Programm / die kürzeste Funktion / Methode, die Sie können, um sie wie beschrieben zu komprimieren. Der Algorithmus muss zwei Zeichenfolgen drucken / zurückgeben: die erste enthält das für die Komprimierung verwendete Wörterbuch und die zweite ist die resultierende komprimierte Zeichenfolge. Sie können die Zeichenfolgen als Tupel, Array, Liste oder was auch immer in der angegebenen Reihenfolge zurückgeben.
Beachten Sie, dass der Algorithmus, wenn die Zeichenfolge in Schritt 2 nicht komprimiert werden kann, eine leere Zeichenfolge als ersten Rückgabewert und das Ergebnis von Schritt 1 als zweiten Rückgabewert zurückgeben muss.
Sie müssen das Ergebnis von Schritt 1 nicht in die Ausgabewerte aufnehmen, sondern nur zur Verdeutlichung in die Beispiele aufnehmen.
Dies ist Code-Golf , also kann die kürzeste Antwort für jede Sprache gewinnen!
Ein weiterer Testfall
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
quelle
S,aT bK@c
würde wahrscheinlich nur gespeichert,S,T K@
ohne explizit die Substitutionszeichen zu benennen, die sich daraus trivial ableiten lassen.Antworten:
JavaScript (ES6),
168167 ByteGibt ein Array mit zwei Zeichenfolgen zurück :
[dictionary, compressed_string]
.Testfälle
Code-Snippet anzeigen
quelle
Python 2 ,
269280268266 BytesHier ist nichts Besonderes los. Gute Gelegenheit, einige einfache reguläre Ausdrücke zu verwenden.
Die erste Version schlug für Zeichenfolgen mit Sonderzeichen fehl, die innerhalb des regulären Ausdrucks interpretiert wurden. Die zweite Version (mit re.escape) funktioniert mit allen Testfällen. Diese Korrektur kostete 11 Bytes.
In der zweiten Version wurden die Ersetzungszeichen nicht in der Reihenfolge zugewiesen, wie in der Problemspezifikation gefordert und von @CarlosAlejo hervorgehoben. Also zurück zum Zeichenbrett.
Korrigierte Version, weiter golfen
Probieren Sie es online aus!
quelle
O,a
.b=a=input()
und speichernn,s,p=96,'',0
?\d+
wäre eine kürzere Regex zu verwenden. Du wirst sowieso nie über 26 gehen, also gibt es keinen Grund sicherzustellen, dass es spezifisch 1-2 Stellen sind. Verwendenre.escape
bedeutet auch, dass eine Basiszeichenfolgereplace
etwas kürzer wird: 253 BytesLua, 215 Bytes
Nur ein gutes Stück Mustervergleich.
Ich denke, Lua wird beim Golfen unterschätzt ... sieh dir all diese Aussagen an, die zusammengedrückt wurden!
quelle
Python 2 , 186 Bytes
Ich hatte gehofft, endlich Verwendung zu finden für
re.subn
: C.In Schritt 2 komprimiert
In Schritt 2 nicht komprimiert
Python 2 , 246 Bytes
Ganzer zweiter Schritt in Repl Lambda von re. Nur zum Spaß.
Probieren Sie es online aus!
quelle
Perl 5
-pl
, 81 BytesProbieren Sie es online aus!
Druckt die codierte Zeichenfolge in der ersten Zeile, die Tripel in der zweiten Zeile
quelle
Ruby
-p
, 133 BytesProbieren Sie es online aus!
quelle