sfondo
La trasformazione move-to-front (MTF) è un algoritmo di codifica dei dati progettato per migliorare le prestazioni delle tecniche di codifica entropica.
Nella algoritmo di compressione bzip2 , viene applicata dopo l' Burrows-Wheeler trasformata (come visto in Burrows, Wheeler e indietro ), con l'obiettivo di trasformare gruppi di caratteri ripetuti in piccoli numeri interi non negativi facilmente comprimibili.
Definizione
Ai fini di questa sfida, definiremo la versione stampabile ASCII dell'MTF come segue:
Data una stringa di input s , prendi un array vuoto r , la stringa d di tutti i caratteri ASCII stampabili (da 0x20 a 0x7E) e ripeti quanto segue per ogni carattere c di s :
Aggiungi l'indice di c in d a r .
Spostare c sulla parte anteriore di d , ovvero rimuovere c da d e anteporre al resto.
Infine, prendiamo gli elementi di r come indici nella d originale e recuperiamo i caratteri corrispondenti.
Esempio passo-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"
Compito
Scrivi un programma o una funzione che implementa l'ASCII MTF stampabile (come definito sopra).
Casi test
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(**:
Regole aggiuntive
Non è possibile utilizzare alcun operatore incorporato che calcola l'MTF di una stringa.
Il codice può stampare una riga finale se si sceglie STDOUT per l'output.
Il codice deve funzionare per qualsiasi input di 1000 o meno caratteri ASCII stampabili (da 0x20 a 0x7E).
Si applicano le regole standard per il golf. Vince l'invio più breve in byte.