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.
la source
Réponses:
CJam, 20
Essayez-le en ligne
Explication:
la source
Autruche ,
4645 caractèresN'ayez pas de numéro de version dans l'en-tête car il ne s'agit en fait que du dernier commit . J'ai ajouté l'
O
opérateur (code ascii à la chaîne) après avoir publié la dernière version (mais toujours avant la publication de ce défi).Explication:
la source
Python 3, 88
Utilisation de quelques idées de ma solution CJam.
-4 octets appartiennent à Sp3000 :)
la source
SWI-Prolog,
239197189 octetsExemple:
a(`Two more questions and I have bzip2 in less than 100 bytes!`).
sorties:(et
true .
après, évidemment)Remarque: votre version SWI-Prolog doit être l'une des plus récentes dans laquelle la citation arrière
`
représente des chaînes de codes. Les chaînes de code étaient représentées par des guillemets doubles"
dans les anciennes versions.la source
Python 2,
137110104Ce n'était pas difficile à mettre en œuvre, mais peut-être quand même jouable au golf?
Essayez-le ici
la source
e=d=map(chr,range(32,127))
en Python 2, bien que vous deviez l'ajustere
pour gérer une liste.e=[e.pop(n)]+e
, mais cela ne fonctionne pas. Pourquoi donc?e=d=
, donc quand vous sautez,e
vous sautez aussid
. Essayezd=e[:]
.n=e.index(ord(c));r+=chr(n+32);
et laisser tomberd
Pyth, 24 octets
Manifestation. Harnais de test.
Le premier morceau.
JK>95CM127
configure la liste nécessaire et l'enregistre dansJ
etK
.~J+d-Jd
effectue la mise à jour de la liste, tout enxL ... z
mappant les caractères saisis à leurs positions dans la liste. Enfin,s@LK
convertit ces index en caractères dans la liste d'origine.la source
Haskell, 120 octets
Exemple d'utilisation:
f "CODEGOLF"
->"COEFH#MI"
Comment ça marche:
#
est une fonction d'index qui retourne la position dee
ins
(ne peut pas utiliser le natif de Haskell àelemIndex
cause d'un prix élevéimport
). La fonction principalef
suit un modèle de pliage où elle met à jour la chaîne de positiond
et la chaîne de résultatr
lorsqu'elle parcourt la chaîne d'entrée.la source