pengantar
Dalam tantangan ini, Anda akan menyelesaikan transformasi Burrows-Wheeler diagonal. Berikut ini adalah gambaran umum tentang apa transformasi Burrows-Wheeler diagonal. Untuk menyandikan pesan, Anda harus memastikan bahwa panjangnya aneh (mis. 5, 7, 9, dll.). Kemudian Anda membuat kotak, n
dengan n
, di mana n
panjang pesan. Baris pertama adalah pesan asli. Setiap baris setelah itu adalah baris di atasnya, tetapi bergeser 1 karakter ke kiri dengan karakter pertama bergerak ke belakang. Sebagai contoh:
Hello World
ello WorldH
llo WorldHe
lo WorldHel
o WorldHell
WorldHello
WorldHello
orldHello W
rldHello Wo
ldHello Wor
dHello Worl
Kemudian Anda mengambil setiap huruf pada NW ke SE diagonal dan memasukkannya ke dalam string baru:
Hello World H
ello WorldH l
llo WorldHe o
lo WorldHel W
o WorldHell r
WorldHello d
WorldHello e
orldHello W l
rldHello Wo (space)
ldHello Wor o
dHello Worl l
Pesan Anda yang disandikan adalah HloWrdel ol
. Untuk memecahkan kode, pertama-tama ambil panjang pesan yang disandikan, tambahkan 1, dan bagi dengan 2. Ayo panggil nomor ini x
. Sekarang kita tahu x
, mulai dari huruf pertama, setiap huruf adalah x
setelah huruf terakhir, berputar-putar. Sebagai contoh:
H l o W r d e l o l
1
Then...
H l o W r d e l o l
1 2
And again...
H l o W r d e l o l
1 3 2
Until you get...
H l o W r d e l o l
1 3 5 7 9 11 2 4 6 8 10
Sekarang atur ulang surat-surat dengan urutan yang benar untuk mendapatkan Hello World
!
Tantangan
Tantangan Anda adalah menulis dua program, fungsi, atau masing-masing. Namun, keduanya harus menggunakan bahasa yang sama. Program pertama akan menerima string sebagai input melalui STDIN, argumen program, atau parameter fungsi dan menyandikannya menggunakan metode ini. Program kedua akan menerima string sebagai input melalui STDIN, argumen program, atau parameter fungsi dan mendekode menggunakan metode ini.
Persyaratan
Program / Fungsi pertama
- Input string tunggal menggunakan metode apa pun yang tercantum di atas.
- Harus menyandikan string menggunakan gaya transformasi Burrows-Wheeler diagonal.
Program / Fungsi kedua
- Input string tunggal menggunakan metode apa pun yang tercantum di atas.
- Harus mendekode string menggunakan gaya transformasi Burrows-Wheeler diagonal.
Kendala
- Anda tidak dapat menggunakan fungsi internal atau eksternal yang menyelesaikan tugas ini.
- Tidak ada celah standar.
- Kedua program / fungsi harus dalam bahasa yang sama.
Mencetak gol
Ini adalah kode golf, jadi program terpendek dalam byte menang.
Jika saya perlu menambahkan lebih banyak informasi, tinggalkan komentar!
sumber
Jawaban:
CJam, (4 + 8 =) 12 byte
Program pengodean:
Cobalah online di sini
Program decoding:
Cobalah online di sini
Bagaimana (atau lebih tepatnya, mengapa) mereka bekerja :
Transformasi Burrows-Wheeler Diagonal pada dasarnya adalah setiap karakter string yang lain, dengan balutan dari ujungnya. Jika kita memperlakukan String sebagai matriks 2D dari 2 kolom, itu hanya bermuara untuk mengambil transformasi dari matriks. Contoh:
Diwakili sebagai matriks 2D sebagai
Sekarang, cukup bacalah kolomnya dengan bijaksana, berikan:
Yang merupakan transformasi Burrows-Wheeler.
Decoding hanya kebalikan dari proses, menulis string sebagai matriks 2D 2 baris dan membaca kolom bijaksana.
Perluasan kode :
Encoder:
Dekoder:
sumber
Python 2, 61 byte
E
mengenkripsi danD
mendekripsi. Saya tidak menghitungE=
danD=
untuk skor.Dekripsi mengambil setiap
n
karakter 'membungkus, di manan
setengah panjang string dibulatkan. Alasan pembalikan ini adalah karena2
dann
inverses modulo panjang string, jadi ambil setiapn
karakter pembalikan mengambil setiap2
nd satu.Jika menggunakan fungsi tunggal diizinkan, saya bisa melakukan 44 byte
The mengenkripsi saat
b
iniFalse
dan mendekripsi saatb
iniTrue
. Ekspresi1+len(x)**b>>b
sama dengan[2,len(x)/2+1][b]
.sumber
J, 10 + 10 = 20
(Kawat gigi yang mengelilinginya tidak dihitung dalam skor karena mereka bukan bagian dari definisi fungsi.)
Terima kasih untuk FUZxxl untuk peningkatan 3 byte.
Sekarang ditunjukkan dengan baik bahwa kedua fungsi terbalik karena yang pertama mengambil karakter dari posisi yang ditentukan oleh daftar
#|2*i.@#
dan fungsi kedua mengatur kembali karakter menggunakan daftar yang sama dengan pemesanan.Cobalah online di sini.
sumber
{~#|2*i.@#
.Pyth - 5 + 11 = 16 byte
Saya perhatikan sebuah pola! ~ Apakah menari bahagia ~ Transformasi hanya benar-benar hanya perulangan melalui string memetik setiap elemen lainnya. Ini hanya bekerja pada aneh karena selain itu tidak akan pernah mendapatkan setengah elemen. Ini sama dengan memutar 2 matriks lebar.
Encoder:
Mengiris langkah Python tidak berputar sehingga saya mengulangi string.
Dekoder:
Sekali lagi tidak ada bungkus untuk step-slicing.
sumber
GNU sed -r, (20 + 104 + 1) = 125
+1 ekstra dalam skor adalah untuk opsi -r untuk sed. String input panjang ganjil diasumsikan.
Encoder:
Dekoder:
Decoder digunakan
:
sebagai karakter marker sementara, jadi jika itu muncul dalam string input, Anda akan mendapatkan perilaku yang tidak terdefinisi. Jika string input dibatasi hingga 95 karakter ASCII, maka marker ini dapat diganti dengan sesuatu di luar rentang ASCII (mis. BEL 0x7) untuk memperbaikinya.:
marker di awal dan di akhir string input:
maju pertama dan:
mundur satu karakter satu demi satu sampai:
penanda adalah kedua sisi karakter tengah:
dan tambahkan yang lain:
ke ujung meninggalkan "A: B:", di mana A adalah string yang terdiri dari karakter aneh dari input plaintext dan B adalah string yang terdiri dari karakter genap:
untuk memasang kembali input plaintext:
spidol yang tersisasumber
JavaScript ES6, 41 + 49 = 90 byte
Encoder
Dekoder
Ini adalah fungsi anonim, jadi saya hanya menghitung kode di dalam tanda kurung karena itu adalah definisi fungsi secara keseluruhan. Cobalah dengan cuplikan di bawah ini: (dimodifikasi untuk menggunakan ES5)
Tampilkan cuplikan kode
sumber
[t=>t.replace(/./g,(_,o)=>t[o*2%t.length]),t=>t.replace(/./g,(_,o)=>t[(1+(l=t.length))/2*o%l])]
:? Anda menggunakannya suka[...][0]('encode string')
dan[...][1]('decode string')
. Tidak ada yang mengatakan bahwa ini tidak dapat dilakukan! Dan Anda menghemat 1 byte.