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.