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.
fuente
Respuestas:
CJam, 20
Pruébalo en línea
Explicación:
fuente
Avestruz ,
4645 caracteresNo tenga un número de versión en el encabezado porque en realidad es solo la última confirmación . He añadido el
O
(código ASCII en cadena) del operador después de lanzar la versión más reciente (aunque antes de este desafío fue publicada).Explicación:
fuente
Pitón 3, 88
Usando algunas ideas de mi solución CJam.
-4 bytes pertenecen a Sp3000 :)
fuente
SWI-Prolog,
239197189 bytesEjemplo:
a(`Two more questions and I have bzip2 in less than 100 bytes!`).
salidas:(y
true .
después de eso, obviamente)Nota: su versión de SWI-Prolog tiene que ser una de las más nuevas en las que la comilla
`
representa cadenas de códigos. Las cadenas de código solían representarse con comillas dobles"
en versiones anteriores.fuente
Pitón 2,
137110104¿No fue difícil de implementar, pero tal vez todavía golfable?
Pruébalo aquí
fuente
e=d=map(chr,range(32,127))
en Python 2, aunque debes modificarloe
para manejar una lista.e=[e.pop(n)]+e
, pero no funciona. ¿Porqué es eso?e=d=
, así que cuandoe
saltas también estás saltandod
. Tratard=e[:]
.n=e.index(ord(c));r+=chr(n+32);
y soltard
Pyth, 24 bytes
Demostración. Arnés de prueba.
El primer bit
JK>95CM127
configura la lista necesaria y la guarda enJ
yK
.~J+d-Jd
realiza la actualización de la lista, mientrasxL ... z
asigna los caracteres de entrada a sus posiciones en la lista. Finalmente,s@LK
convierte esos índices en caracteres en la lista original.fuente
Haskell, 120 bytes
Ejemplo de uso:
f "CODEGOLF"
->"COEFH#MI"
Cómo funciona:
#
es una función de índice que devuelve la posición dee
ins
(no se puede usar el nativo de HaskellelemIndex
debido a que es costosoimport
). La función principalf
sigue un patrón de plegado donde actualiza la cadena de posiciónd
y la cadena de resultados ar
medida que avanza por la cadena de entrada.fuente