Tulis dua program:
- Satu yang membaca string dan kunci dan mengkodekan string ke cipher pagar-pagar menggunakan kunci itu. - Demikian pula, tulis program untuk fungsi terbalik: menguraikan pagar pagar menggunakan kunci.
Bagi mereka yang tidak tahu apa itu rail rail cipher, pada dasarnya metode menulis teks biasa dengan cara menciptakan pola linier dengan cara spiral. Contoh - ketika "FOOBARBAZQUX" dipagari menggunakan kunci 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Membaca baris demi baris spiral di atas, teks sandi menjadi "FAZOBRAQXOBU".
Baca lebih lanjut di - Rail rail cipher - Wikipedia .
Selamat datang di kode dalam bahasa apa pun.
Jawaban terpendek dalam byte menang.
code-golf
cryptography
cipher
ShuklaSannidhya
sumber
sumber
Jawaban:
Python 133 byte
Penggunaan sampel:
Catatan: hasil dari penghitungan kereta api genap berbeda dari kode yang Anda berikan, tetapi hasilnya tampaknya benar. Misalnya, 6 rel:
sesuai dengan
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, dan bukanAKUTBLVJICMSWXRDNHQYEOGZFP
saat kode Anda menghasilkan.Ide dasarnya adalah bahwa setiap kereta api dapat ditemukan secara langsung dengan mengambil irisan tali
[i::m]
, di manai
adalah jumlah rel (0
-indexed), danm
adalah(num_rails - 1)*2
. Rel bagian dalam juga perlu terjalin dengan[m-i::m]
, dicapai dengan zip dan bergabung dengan dua set karakter. Karena yang kedua ini berpotensi menjadi satu karakter lebih pendek,itu diisi dengan karakter yang dianggap tidak muncul di mana pun (dikonversi ke daftar, dan diisi dengan string kosong._
), dan kemudian karakter itu dilucuti jika perluBentuk yang sedikit lebih bisa dibaca manusia:
sumber
APL
5241Jika string teks input i dan nomor kunci n diinisialisasi, solusi dapat dipersingkat menjadi 9 karakter. Menjalankan solusi melawan contoh yang diberikan oleh primo memberikan jawaban yang identik:
Pada refleksi lebih lanjut tampaknya ada solusi berbasis indeks yang lebih pendek:
sumber
Python 2 , 124 + 179 = 303 byte
Menyandi:
Cobalah online!
Membaca sandi:
Cobalah online!
sumber
MATL, 70 byte (total)
Cobalah di MATL Online
Coba beberapa uji kasus
Mengambil bendera sebagai input ketiga
F
,T
untuk menguraikan string, untuk menguraikannya (terima kasih kepada Kevin Cruijssen untuk ide itu).Ini dimulai sebagai jawaban Julia sampai saya menyadari pengetikan yang ketat terlalu banyak, terutama untuk penguraian. Berikut kode Julia yang saya miliki untuk penyandian (backported ke v0.6 untuk TIO):
Julia 0,6 , 191 byte
Cobalah online!
Penjelasan:
Operasi pagar pagar
dapat dilihat sebagai membaca r = 3 karakter input, kemudian membaca r-2 karakter dan awalan dan suffix dengan nilai dummy (nulls), kemudian membaca r karakter lagi, dll., membuat kolom baru setiap kali:
kemudian membalikkan setiap kolom kedua (karena bagian zag dari zigzag naik bukan ke bawah, yang membuat perbedaan ketika r> 3), kemudian membaca matriks ini di sepanjang baris, dan menghapus karakter dummy.
Penguraian tampaknya tidak memiliki pola yang jelas seperti ini, tetapi ketika mencari-cari tentang hal ini saya menemukan posting ini , yang mengatakan kepada saya bahwa (a) ini adalah algoritma yang terkenal dan (mungkin?) Dipublikasikan untuk cipher kereta api, dan ( b) penguraian adalah penggunaan kembali yang sederhana dari metode yang sama, memberikannya indeks string dan mendapatkan indeks indeks tersebut setelah pengodean, dan membaca ciphertext di tempat-tempat itu.
Karena penguraian perlu melakukan hal-hal dengan mengerjakan indeks, kode ini melakukan pengodean juga dengan menyortir indeks string, dan kemudian dalam hal ini hanya mengindeks pada indeks yang disusun ulang.
sumber
Saya ingin dijelaskan dalam kode ini.
sumber
Java 10,
459451445439327 byte-12 byte terima kasih kepada @ceilingcat .
-112 byte menggabungkan dua fungsi dengan flag mode tambahan sebagai input.
Fungsi ini mengambil input ketiga
M
. Jika ini dia akan menguraikantrue
, dan jikafalse
itu akan menguraikan.Cobalah online.
Penjelasan:
sumber