Antecedentes
La transformación de movimiento al frente (MTF) es un algoritmo de codificación de datos diseñado para mejorar el rendimiento de las técnicas de codificación de entropía.
En el algoritmo de compresión bzip2 , se aplica después de la transformación Burrows – Wheeler (como se ve en Burrows, Wheeler y Back ), con el objetivo de convertir grupos de caracteres repetidos en enteros pequeños, no negativos, fácilmente comprimibles.
Definición
Para el propósito de este desafío, definiremos la versión ASCII imprimible del MTF de la siguiente manera:
Dada una cadena de entrada s , tome una matriz vacía r , la cadena d de todos los caracteres ASCII imprimibles (0x20 a 0x7E) y repita lo siguiente para cada carácter c de s :
Anexar el índice de c en d a r .
Mueva c al frente de d , es decir, quite c de d y prepárela al resto.
Finalmente, tomamos los elementos de r como índices en la d original y buscamos los caracteres correspondientes.
Ejemplo paso a paso
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"
Tarea
Escriba un programa o función que implemente el MTF ASCII imprimible (como se definió anteriormente).
Casos de prueba
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(**:
Reglas adicionales
No puede utilizar ningún operador integrado que calcule el MTF de una cadena.
Su código puede imprimir una nueva línea final si elige STDOUT para la salida.
Su código tiene que funcionar para cualquier entrada de 1000 caracteres ASCII o menos imprimibles (0x20 a 0x7E).
Se aplican reglas estándar de golf de código. La presentación más corta en bytes gana.