Introducción
En este desafío, resolverás transformaciones diagonales de Burrows-Wheeler. Aquí hay una descripción general de lo que es una transformación diagonal de Burrows-Wheeler. Para codificar un mensaje, primero debe garantizar que tenga una longitud impar (es decir, 5, 7, 9, etc.). Luego haces una cuadrícula, n
por n
, donde n
está la longitud del mensaje. La primera fila es el mensaje original. Cada fila después de eso es la fila de arriba, pero cambió 1 carácter a la izquierda con el primer carácter moviéndose hacia atrás. Por ejemplo:
Hello World
ello WorldH
llo WorldHe
lo WorldHel
o WorldHell
WorldHello
WorldHello
orldHello W
rldHello Wo
ldHello Wor
dHello Worl
Luego, toma cada letra en la diagonal NW a SE y la coloca en una nueva cadena:
Hello World H
ello WorldH l
llo WorldHe o
lo WorldHel W
o WorldHell r
WorldHello d
WorldHello e
orldHello W l
rldHello Wo (space)
ldHello Wor o
dHello Worl l
Su mensaje codificado es HloWrdel ol
. Para decodificar, primero tome la longitud del mensaje codificado, agregue 1 y divida por 2. Llamemos a este número x
. Ahora que sabemos x
, comenzando en la primera letra, cada letra es x
posterior a la última, dando vueltas. Por ejemplo:
H l o W r d e l o l
1
Then...
H l o W r d e l o l
1 2
And again...
H l o W r d e l o l
1 3 2
Until you get...
H l o W r d e l o l
1 3 5 7 9 11 2 4 6 8 10
¡Ahora solo reorganiza las letras en el orden correcto para obtenerlas Hello World
!
Desafío
Su desafío es escribir dos programas, funciones o uno de cada uno. Sin embargo, ambos deben usar el mismo idioma. El primer programa aceptará una cadena como entrada a través de STDIN, argumentos de programa o parámetros de función y la codificará utilizando este método. El segundo programa aceptará una cadena como entrada a través de STDIN, argumentos de programa o parámetros de función y la decodificará utilizando este método.
Requisitos
Primer programa / función
- Una sola entrada de cadena usando cualquier método mencionado anteriormente.
- Debe codificar la cadena utilizando un estilo de transformación diagonal Burrows-Wheeler.
Segundo programa / función
- Una sola entrada de cadena usando cualquier método mencionado anteriormente.
- Debe decodificar la cadena con un estilo de transformación diagonal Burrows-Wheeler.
Restricciones
- No puede utilizar ninguna función incorporada o externa que realice esta tarea.
- Las lagunas estándar no están permitidas.
- Ambos programas / funciones deben estar en el mismo idioma.
Puntuación
Este es el código de golf, por lo que gana el programa más corto en bytes .
Si necesito agregar más información, ¡deja un comentario!
fuente
Respuestas:
CJam, (4 + 8 =) 12 bytes
Programa de codificación:
Pruébalo en línea aquí
Programa de decodificación:
Pruébalo en línea aquí
Cómo (o más bien, por qué) funcionan :
La transformación Diagonal Burrows-Wheeler es básicamente cualquier otro carácter de la cadena, con ajuste desde el final. Si tratamos la cadena como una matriz 2D de 2 columnas, simplemente se reduce a tomar la transformación de la matriz. Ejemplo:
Se representa como matriz 2D como
Ahora, simplemente leyéndolo en columna, dé:
Cuál es la transformación de Burrows-Wheeler.
La decodificación es simplemente inversa del proceso, escribe la cadena como una matriz 2D de 2 filas y lee en columna.
Expansión de código :
Codificador:
Descifrador:
fuente
Python 2, 61 bytes
E
Cifra yD
descifra. No estoy contando elE=
yD=
para el puntaje.El descifrado toma todos
n
los caracteres que se envuelven, donden
es la mitad de la longitud de la cadena redondeada. La razón por la que esto se invierte es eso,2
yn
son inversos en el módulo de la longitud de la cadena, por lo que tomar cadan
th carácter se invierte tomando cada2
nd.Si se permitiera usar una sola función, podría hacer 44 bytes
Cifra cuando
b
esFalse
y descifra cuandob
esTrue
. La expresión1+len(x)**b>>b
es igual a[2,len(x)/2+1][b]
.fuente
J, 10 + 10 = 20
(Las llaves circundantes no se cuentan en la puntuación, ya que no forman parte de la definición de la función).
Gracias por FUZxxl por una mejora de 3 bytes.
Ahora se muestra muy bien que las dos funciones son inversas, ya que la primera toma caracteres de las posiciones definidas por la lista
#|2*i.@#
y la segunda función ordena los caracteres usando la misma lista como ordenando.Pruébelo en línea aquí.
fuente
{~#|2*i.@#
.Pyth - 5 + 11 = 16 bytes
¡Noté un patrón! ~ Danza feliz ~ La transformación es realmente solo un bucle a través de la cadena que selecciona todos los demás elementos. Solo funciona en modo impar ya que de lo contrario nunca obtendría la mitad de los elementos. Esto es equivalente a rotar una matriz de 2 de ancho.
Codificador:
El corte de pasos de Python no gira, así que repetí la cuerda.
Descifrador:
Una vez más, no hay vuelta para cortar en rodajas.
fuente
GNU sed -r, (20 + 104 + 1) = 125
El +1 extra en el puntaje es para la opción -r sed. Se suponen cadenas de entrada de longitud impar.
Codificador:
Descifrador:
El decodificador se utiliza
:
como un marcador temporal, por lo que si aparece en la cadena de entrada, obtendrá un comportamiento indefinido. Si la cadena de entrada está restringida a los 95 caracteres ASCII, estos marcadores se pueden reemplazar con algo fuera del rango ASCII (por ejemplo, BEL 0x7) para solucionar esto.:
marcadores al principio y al final de la cadena de entrada.:
adelante y el segundo:
hacia atrás un carácter a la vez hasta que los:
marcadores estén a ambos lados del personaje del medio:
y agregue otro:
al final dejando "A: B:", donde A es la cadena compuesta de caracteres impares de la entrada de texto sin formato y B es la cadena compuesta de los caracteres pares:
para volver a ensamblar la entrada de texto sin formato:
marcadores restantesfuente
JavaScript ES6, 41 + 49 = 90 bytes
Codificador
Descifrador
Estas son funciones anónimas, por lo que solo cuento el código dentro de los paréntesis porque esa es la definición completa de la función. Pruébelo con el fragmento a continuación: (modificado para usar ES5)
Mostrar fragmento de código
fuente
[t=>t.replace(/./g,(_,o)=>t[o*2%t.length]),t=>t.replace(/./g,(_,o)=>t[(1+(l=t.length))/2*o%l])]
? Lo usas como[...][0]('encode string')
y[...][1]('decode string')
. ¡No hay nada que diga que esto no se puede hacer! Y ahorras 1 byte.