fundo
Depois de aplicar o BWT (como visto em Burrows, Wheeler e Back ) e o MTF (como visto em Mover para a frente ASCII imprimível ), o compressor bzip2 aplica uma forma bastante única de codificação de execução.
Definição
Para o objetivo deste desafio, definimos a transformação BRLE da seguinte forma:
Dada uma sequência de entrada s que consiste apenas em caracteres ASCII com pontos de código entre 0x20 e 0x7A, faça o seguinte:
Substitua cada execução de caracteres iguais por uma única ocorrência do caractere e armazene o número de repetições após o primeiro.
Codifique o número de repetições após a primeira ocorrência do caractere , usando a numeração bijetiva de base 2 e os símbolos
{
e}
.Um número inteiro não negativo n é codificado como a cadeia b k … b 0, de modo que n = 2 k i (b k ) +… + 2 0 i (b 0 ) , onde i (
{
) = 1 e i (}
) = 2 .Observe que essa representação é sempre única. Por exemplo, o número 0 é codificado como uma sequência vazia.
Insira a sequência de colchetes que codifica o número de repetições após a ocorrência única do caractere correspondente.
Exemplo passo a passo
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{{{"
Tarefa
Implemente um programa ou função involutivo que leia uma única cadeia de caracteres de STDIN ou como argumento de linha de comando ou função e imprima ou retorne o BRLE ou seu inverso da cadeia de entrada.
Se a entrada não contiver colchetes, aplique o BRLE. Se a entrada contiver colchetes, aplique seu inverso.
Exemplos
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
Regras adicionais
Você não pode usar nenhum componente interno que calcule o BRLE ou o inverso de uma sequência.
Você pode usar built-ins que:
Calcule o RLE ou o RLD de uma sequência, desde que o número de repetições não seja armazenado na base bijetiva-2.
Realize a conversão básica de qualquer tipo.
Seu código pode imprimir uma nova linha à direita se você escolher STDOUT para saída.
Seu código precisa funcionar para qualquer entrada de 1000 caracteres ASCII ou menos no intervalo de 0x20 a 0x7A, além de colchetes (0x7B e 0x7D).
Se a entrada contiver colchetes, você pode assumir que é um resultado válido da aplicação do BRLE a uma string.
Aplicam-se regras de código padrão de golfe. O menor envio em bytes vence.