fundo
A transformação de movimento para frente (MTF) é um algoritmo de codificação de dados projetado para melhorar o desempenho das técnicas de codificação de entropia.
No algoritmo de compactação bzip2 , é aplicado após a transformação Burrows – Wheeler (como visto em Burrows, Wheeler e Back ), com o objetivo de transformar grupos de caracteres repetidos em números inteiros não negativos pequenos e facilmente compactáveis.
Definição
Para o objetivo deste desafio, definiremos a versão ASCII imprimível do MTF da seguinte maneira:
Dada uma sequência de entrada s , pegue uma matriz vazia r , a sequência d de todos os caracteres ASCII imprimíveis (0x20 a 0x7E) e repita o seguinte para cada caractere c de s :
Anexe o índice de c em d para r .
Mova c para a frente de d , ou seja, remova c de d e coloque-o no restante.
Finalmente, pegamos os elementos de r como índices no original d e buscamos os caracteres correspondentes.
Exemplo passo a passo
INPUT: "CODEGOLF"
0. s = "CODEGOLF"
d = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = []
1. s = "ODEGOLF"
d = "C !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35]
2. s = "DEGOLF"
d = "OC !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47]
3. s = "EGOLF"
d = "DOC !\"#$%&'()*+,-./0123456789:;<=>?@ABEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37]
4. s = "GOLF"
d = "EDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38]
5. s = "OLF"
d = "GEDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40]
6. s = "LF"
d = "OGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3]
7. s = "F"
d = "LOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45]
8. s = ""
d = "FLOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45 41]
OUTPUT: "COEFH#MI"
Tarefa
Escreva um programa ou função que implemente o MTF ASCII imprimível (conforme definido acima).
Casos de teste
Input: Programming Puzzles & Code Golf
Output: Prpi"do lp%((uz rnu&3!P/o&$U$(p
Input: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN BATMAN!
Output: Na! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!"DDUP"%'
Input: Two more questions and I have bzip2 in less than 100 bytes!
Output: Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:
Regras adicionais
Você não pode usar nenhum operador interno que calcule o MTF de uma sequência.
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 imprimíveis ou menos (0x20 a 0x7E).
Aplicam-se as regras de código padrão do golfe. O menor envio em bytes vence.