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.
fonte
Respostas:
CJam, 20
Experimente online
Explicação:
fonte
Avestruz ,
4645 caracteresNão tenha um número de versão no cabeçalho, porque este é apenas o último commit . Eu adicionei o
O
(código ASCII para string) operador depois de lançar a versão mais recente (mas ainda antes de este desafio foi publicado).Explicação:
fonte
Python 3, 88
Usando algumas idéias da minha solução CJam.
-4 bytes pertencem ao Sp3000 :)
fonte
SWI-Prolog,
239197189 bytesExemplo:
a(`Two more questions and I have bzip2 in less than 100 bytes!`).
saídas:(e
true .
depois disso, obviamente)Nota: sua versão do SWI-Prolog deve ser uma das mais recentes, nas quais a cotação posterior
`
representa sequências de códigos. As cadeias de código costumavam ser representadas com aspas duplas"
em versões mais antigas.fonte
Python 2,
137110104Não foi difícil de implementar, mas talvez ainda seja um jogo de golfe?
Experimente aqui
fonte
e=d=map(chr,range(32,127))
no Python 2, apesar de precisar ajustá-loe
para lidar com uma lista.e=[e.pop(n)]+e
, mas não funciona. Por que é que?e=d=
, então quando você sai,e
também está saindod
. Tented=e[:]
.n=e.index(ord(c));r+=chr(n+32);
e soltard
Pitão, 24 bytes
Demonstração. Equipamento de teste.
A primeira parte.
JK>95CM127
configura a lista necessária e a salva emJ
eK
.~J+d-Jd
executa a atualização da lista, enquantoxL ... z
mapeia os caracteres de entrada para suas posições na lista. Por fim,s@LK
converte esses índices em caracteres na lista original.fonte
Haskell, 120 bytes
Exemplo de uso:
f "CODEGOLF"
->"COEFH#MI"
Como funciona:
#
é uma função de índice que retorna a posição dee
ins
(não é possível usar o nativo de Haskell porelemIndex
causa de um caroimport
). A função principalf
segue um padrão de dobra em que atualiza a sequência de posiçãod
e a sequência de resultados àr
medida que caminha pela sequência de entrada.fonte