Hintergrund
Die Move-to-Front-Transformation (MTF) ist ein Datencodierungsalgorithmus zur Verbesserung der Leistung von Entropiecodierungstechniken.
Der bzip2-Komprimierungsalgorithmus wird nach der Burrows-Wheeler-Transformation (wie in Burrows, Wheeler und Back ) angewendet , mit dem Ziel, Gruppen sich wiederholender Zeichen in kleine, leicht komprimierbare, nicht negative Ganzzahlen umzuwandeln.
Definition
Für diese Herausforderung definieren wir die druckbare ASCII-Version des MTF wie folgt:
Nehmen Sie für eine eingegebene Zeichenfolge s ein leeres Array r , die Zeichenfolge d aller druckbaren ASCII-Zeichen (0x20 bis 0x7E), und wiederholen Sie Folgendes für jedes Zeichen c von s :
Fügen Sie den Index von c in d an r an .
Bewegen Sie c vor d , dh entfernen Sie c von d und stellen Sie es dem Rest voran.
Schließlich nehmen wir die Elemente von r als Indizes im ursprünglichen d und holen die entsprechenden Zeichen.
Beispiel Schritt für Schritt
INPUT: "CODEGOLF"
0. s = "CODEGOLF"
d = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = []
1. s = "ODEGOLF"
d = "C !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35]
2. s = "DEGOLF"
d = "OC !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47]
3. s = "EGOLF"
d = "DOC !\"#$%&'()*+,-./0123456789:;<=>?@ABEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37]
4. s = "GOLF"
d = "EDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38]
5. s = "OLF"
d = "GEDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40]
6. s = "LF"
d = "OGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3]
7. s = "F"
d = "LOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45]
8. s = ""
d = "FLOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45 41]
OUTPUT: "COEFH#MI"
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die das druckbare ASCII-MTF (wie oben definiert) implementiert.
Testfälle
Input: Programming Puzzles & Code Golf
Output: Prpi"do lp%((uz rnu&3!P/o&$U$(p
Input: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN BATMAN!
Output: Na! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!"DDUP"%'
Input: Two more questions and I have bzip2 in less than 100 bytes!
Output: Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:
Zusätzliche Regeln
Sie können keinen integrierten Operator verwenden, der die MTF einer Zeichenfolge berechnet.
Ihr Code druckt möglicherweise eine abschließende neue Zeile, wenn Sie für die Ausgabe STDOUT auswählen.
Ihr Code muss für jede Eingabe von 1000 oder weniger druckbaren ASCII-Zeichen (0x20 bis 0x7E) funktionieren.
Es gelten die Standard-Code-Golfregeln. Die kürzeste Übermittlung in Bytes gewinnt.