Antecedentes
Después de aplicar el BWT (como se ve en Burrows, Wheeler y Back ) y el MTF (como se ve en Mover al frente ASCII imprimible ), el compresor bzip2 aplica una forma bastante única de codificación de longitud de ejecución.
Definición
Para el propósito de este desafío, definimos la transformación BRLE de la siguiente manera:
Dada una cadena de entrada s que consiste únicamente en caracteres ASCII con puntos de código entre 0x20 y 0x7A, haga lo siguiente:
Reemplace cada ejecución de caracteres iguales por una sola aparición del personaje y almacene el número de repeticiones después de la primera.
Codifique el número de repeticiones después de la primera aparición del personaje , usando la numeración biyectiva base-2 y los símbolos
{
y}
.Un número entero no negativo n se codifica como la cadena b k … b 0 de modo que n = 2 k i (b k ) +… + 2 0 i (b 0 ) , donde i (
{
) = 1 e i (}
) = 2 .Tenga en cuenta que esta representación es siempre única. Por ejemplo, el número 0 está codificado como una cadena vacía.
Inserte la cadena de llaves que codifica el número de repeticiones después de la aparición del carácter correspondiente.
Ejemplo paso a paso
Input: "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"
Tarea
Implemente un programa o función involutiva que lea una sola cadena de STDIN o como argumento de línea de comando o función e imprima o devuelva el BRLE o su inverso de la cadena de entrada.
Si la entrada no contiene llaves, aplique el BRLE. Si la entrada contiene corchetes, aplique su inverso.
Ejemplos
INPUT: CODEGOLF
OUTPUT: CODEGOLF
INPUT: PROGRAMMING
OUTPUT: PROGRAM{ING
INPUT: PUZ{LES
OUTPUT: PUZZLES
INPUT: 444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{
INPUT: y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Reglas adicionales
No puede utilizar ninguna función integrada que calcule el BRLE o su inverso de una cadena.
Usted puede utilizar muebles empotrados que:
Calcule el RLE o RLD de una cadena, siempre que el número de repeticiones no esté almacenado en la base 2 de bijective.
Realizar conversión de base de cualquier tipo.
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 en el rango de 0x20 a 0x7A, más llaves (0x7B y 0x7D).
Si la entrada contiene llaves, puede suponer que es un resultado válido de aplicar el BRLE a una cadena.
Se aplican las reglas estándar del código de golf. La presentación más corta en bytes gana.
fuente
Respuestas:
CJam,
5048 bytesGracias por Dennis por guardar 2 bytes.
Pruébalo en línea.
Explicación
fuente
Pyth, 48
50bytes2 bytes gracias a @Maltysen.
Demostración. Prueba de arnés.
Explicación:
fuente
"{}"
que puedas usar`H
, atado con CJam :)OCaml, 252
t
es la función que hace la transformación.Al principio pensaba que tenía que verificar la presencia de llaves, pero resultó ser innecesario. La decodificación claramente no tiene efecto en las cadenas que ya están decodificadas, y la parte de codificación resultó igualmente inofensiva para las que ya estaban codificadas.
fuente
the encoding part proved equally harmless
¿lo hace? Codificación4{{8{{{G{{{{W{{{{{
no entiendes4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Alguna explicación
Número n a BB2 usando 0 y 1:
(n+1).toString(2).slice(1)
Cadena en BB2 a número: to_number ("0b1" + cadena), es decir, agregue un dígito binario más a la izquierda y convierta de binario (y disminuya en 1, no es necesario en esta instancia específica).
Expresión regular para encontrar cualquier carácter seguido de
{
o}
:/[^{}][{}]+/g
Expresión regular para encontrar caracteres repetidos:
/(.)\1*/g
Usando ese regexp en replace, el primer parámetro es el carácter "repetido" (eventualmente se repite solo 1 vez), el segundo parámetro es la cadena repetida total, cuya longitud es el número que necesito codificar en BB2 ya incrementado en 1
... luego poner todo junto ...
fuente