Latar Belakang
The Langkah-to-front transform (MTF) adalah data yang pengkodean algoritma yang dirancang untuk meningkatkan kinerja teknik encoding entropi.
Dalam algoritma kompresi bzip2 , ini diterapkan setelah transformasi Burrows-Wheeler (seperti yang terlihat di Burrows, Wheeler dan Kembali ), dengan tujuan mengubah kelompok karakter yang diulang menjadi bilangan bulat non-negatif yang kecil dan mudah dikompres.
Definisi
Untuk tujuan tantangan ini, kami akan menentukan versi MTC ASCII yang dapat dicetak sebagai berikut:
Diberikan string input s , ambil array kosong r , string d dari semua karakter ASCII yang dapat dicetak (0x20 hingga 0x7E) dan ulangi yang berikut untuk setiap karakter c dari s :
Tambahkan indeks c dalam d ke r .
Pindahkan c ke bagian depan d , yaitu, hapus c dari d dan tambahkan ke sisanya.
Akhirnya, kita mengambil elemen r sebagai indeks dalam d asli dan mengambil karakter yang sesuai.
Contoh langkah demi langkah
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"
Tugas
Tulis program atau fungsi yang mengimplementasikan MTF ASCII yang dapat dicetak (sebagaimana didefinisikan di atas).
Uji kasus
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(**:
Aturan tambahan
Anda tidak dapat menggunakan operator bawaan yang menghitung MTF string.
Kode Anda dapat mencetak baris tambahan jika Anda memilih STDOUT untuk hasil.
Kode Anda harus berfungsi untuk input 1000 atau kurang karakter ASCII yang dapat dicetak (0x20 hingga 0x7E).
Aturan golf kode standar berlaku. Pengajuan terpendek dalam byte menang.
sumber
Jawaban:
CJam, 20
Cobalah online
Penjelasan:
sumber
Burung unta ,
4645 karakterTidak memiliki nomor versi di header karena ini sebenarnya hanya komit terbaru . Saya menambahkan
O
operator (kode ascii ke string) setelah merilis versi terbaru (tetapi masih sebelum tantangan ini diposting).Penjelasan:
sumber
Python 3, 88
Menggunakan beberapa ide dari solusi CJam saya.
-4 byte milik Sp3000 :)
sumber
SWI-Prolog,
239197189 byteContoh:
a(`Two more questions and I have bzip2 in less than 100 bytes!`).
keluaran:(dan
true .
setelah itu, jelas)Catatan: versi SWI-Prolog Anda harus salah satu yang lebih baru di mana backquote
`
mewakili string kode. String kode yang digunakan untuk diwakili dengan tanda kutip ganda"
dalam versi yang lebih lama.sumber
Python 2,
137110104Tidak sulit untuk diterapkan, tetapi mungkin masih bisa golf?
Coba di sini
sumber
e=d=map(chr,range(32,127))
dengan Python 2, meskipun Anda harus men-tweake
untuk menangani daftar.e=[e.pop(n)]+e
, tetapi tidak berhasil. Mengapa demikian?e=d=
, jadi ketika Anda pop darie
Anda juga muncul darid
. Cobad=e[:]
.n=e.index(ord(c));r+=chr(n+32);
dan menjatuhkand
Pyth, 24 byte
Demonstrasi. Uji Harness.
Bit pertama.
JK>95CM127
mengatur daftar yang diperlukan dan menyimpannya keJ
danK
.~J+d-Jd
melakukan pembaruan daftar, sementaraxL ... z
memetakan karakter input ke posisi mereka dalam daftar. Akhirnya,s@LK
ubah indeks tersebut menjadi karakter dalam daftar asli.sumber
Haskell, 120 byte
Contoh penggunaan:
f "CODEGOLF"
->"COEFH#MI"
Cara kerjanya:
#
adalah fungsi indeks yang mengembalikan posisie
dalams
(tidak dapat menggunakan asli HaskellelemIndex
karena mahalimport
). Fungsi utamaf
mengikuti pola lipatan di mana ia memperbarui string posisid
dan string hasilr
saat berjalan melalui string input.sumber