Contexte
La transformation de déplacement vers l'avant (MTF) est un algorithme de codage de données conçu pour améliorer les performances des techniques de codage entropique.
Dans l' algorithme de compression bzip2 , il est appliqué après la transformation Burrows – Wheeler (comme on le voit dans Burrows, Wheeler et Back ), dans le but de transformer des groupes de caractères répétés en petits entiers non négatifs facilement compressibles.
Définition
Aux fins de ce défi, nous définirons la version ASCII imprimable du MTF comme suit:
Étant donné une chaîne d'entrée s , prenez un tableau vide r , la chaîne d de tous les caractères ASCII imprimables (0x20 à 0x7E) et répétez ce qui suit pour chaque caractère c de s :
Ajoutez l'index de c en d à r .
Déplacez c vers l'avant de d , c'est-à-dire, supprimez c de d et ajoutez-le au reste.
Enfin, nous prenons les éléments de r comme index dans le d original et récupérons les caractères correspondants.
Exemple pas à pas
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"
Tâche
Écrivez un programme ou une fonction qui implémente le MTF ASCII imprimable (tel que défini ci-dessus).
Cas de test
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(**:
Règles supplémentaires
Vous ne pouvez pas utiliser d'opérateur intégré qui calcule le MTF d'une chaîne.
Votre code peut imprimer une nouvelle ligne de fin si vous choisissez STDOUT pour la sortie.
Votre code doit fonctionner pour toute entrée de 1000 caractères ASCII imprimables ou moins (0x20 à 0x7E).
Les règles de golf du code standard s'appliquent. La soumission la plus courte en octets l'emporte.