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"
S,aT bK@c
würde wahrscheinlich nur gespeichert, S,T K@
ohne explizit die Substitutionszeichen zu benennen, die sich daraus trivial ableiten lassen.