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.
fonte
Respostas:
CJam,
5048 bytesObrigado por Dennis por salvar 2 bytes.
Experimente online.
Explicação
fonte
Pitão, 48
50bytes2 bytes graças a @Maltysen.
Demonstração. Equipamento de teste.
Explicação:
fonte
"{}"
você pode usar`H
, amarrado com CJam :)OCaml, 252
t
é a função que faz a transformação.No começo, eu pensava que tinha que verificar a presença de suspensórios, mas acabou sendo desnecessário. A decodificação claramente não tem efeito nas seqüências de caracteres que já foram decodificadas, e a parte de codificação se mostrou igualmente inofensiva para as que já foram codificadas.
fonte
the encoding part proved equally harmless
faz isso? Codificação4{{8{{{G{{{{W{{{{{
você não entende4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Alguma explicação
Numere n a BB2 usando 0 e 1:
(n+1).toString(2).slice(1)
Seqüência no BB2 para número: to_number ("0b1" + string) - ou seja, adicione um dígito binário mais à esquerda e converta do binário (e diminua 1, não necessário nesta instância específica).
Expressão regular para encontrar qualquer caractere seguido por
{
ou}
:/[^{}][{}]+/g
Expressão regular para encontrar caracteres repetidos:
/(.)\1*/g
Usando esse regexp em replace, o primeiro param é o caractere "repetido" (eventualmente repete apenas uma vez), o segundo param é a string total repetida, cujo comprimento é o número que eu preciso codificar no BB2 já incrementado por 1
... então junte tudo ...
fonte