Tulis program yang mengambil dua baris input dan gunakan yang pertama sebagai frase kunci untuk mengenkripsi yang kedua sesuai dengan teknik enkripsi Playfair.
Wikipedia menjelaskan enkripsi Playfair dalam beberapa detail , tetapi untuk menghindari ambiguitas, berikut ringkasan singkatnya:
1. Hasilkan tabel kunci:
Ganti semua kemunculan J
dalam frasa kunci dengan I
, lalu hapus semua karakter non-alfabet dan karakter berulang. Masukkan ke dalam tabel enkripsi 5 × 5, mengisi sel-sel yang tersisa dengan sisa alfabet (kecuali J
; kami tidak suka J
).
Contoh:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Siapkan pesan yang akan dienkripsi
Ganti setiap J
dengan I
, strip semua karakter non-alfabet dan pisahkan menjadi pasangan, gunakan X
untuk mematahkan pasangan yang mengandung huruf yang sama dua kali. Jika Anda berakhir dengan jumlah huruf ganjil, tambahkan X
di bagian akhir. (Catatan: Angka telah dibilang penuh - ONE
, TWO
, THREE
, dll - tetapi Anda dapat menganggap ini sudah dilakukan untuk Anda.)
Contoh:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Enkripsi
Enkripsi setiap pasangan huruf secara bergantian. Jika mereka berada di baris dan kolom dari tabel kunci yang berbeda, ganti masing-masing dengan surat dari baris yang sama dalam kolom di mana huruf lainnya ditemukan (misalnya, VM
⇒ EI
, LZ
⇒ GQ
). Jika mereka berada di baris yang sama (atau kolom), pilih dua karakter segera ke kanan (atau di bawah), balas jika perlu (misalnya, OE
⇒ VR
, ZG
⇒ KP
).
Contoh:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
String yang dihasilkan oleh proses ini adalah pesan terenkripsi, yang harus dihasilkan oleh program Anda.
Aturan:
- Teks dan kunci input dapat diperoleh dari
stdin
, argumen baris perintah atau sumber lain semacam itu. Input kode-keras tidak diizinkan. - Program Anda harus menerima teks huruf besar dan kecil untuk frasa sandi dan pesannya.
- Output terenkripsi mungkin huruf besar atau kecil.
- Program Anda harus menerima frasa kunci paling tidak panjangnya 64 karakter, dan pesan teks minimal 16 KB.
- Anda tidak diharuskan menangani input non-ASCII.
- Anda dapat mengabaikan kemungkinan pasangan surat
XX
terjadi selama enkripsi. - Tidak perlu menambahkan spasi putih ke output program.
- Jawaban Anda harus mencakup contoh pesan, frase kunci dan output terenkripsi yang dihasilkan oleh program Anda.
- Ini adalah tantangan kode golf, jadi jawaban dengan kode terpendek (dalam byte) akan menang.
CATATAN: Harap diingat bahwa Anda hanya perlu memecah huruf berurutan jika muncul dalam pasangan yang sama . Jadi misalnya
MASSACHUSETTS
harus dienkripsi sebagaiMA SX SA CH US ET TS
- gandaS
harus dipisah, tetapi gandaT
tidak.
sumber
J
" Apakah Anda menyimpan sentimen serupa tentang APL?Jawaban:
JI *,536431417380263218203197186167(dengan saran luas dari @algorithmshark)
contoh gunakan:
membagi input dengan benar:
* ganti setiap
J
denganI
, kan?sumber
Ruby,
461411366359352346330 karakterTerima kasih kepada @daniero karena telah menyelamatkan ... err, banyak byte. \Hai/
Berikut adalah kode yang tidak dikenali:
Berikut beberapa contoh output:
sumber
chars
ke dalam array, dengan asumsi Anda menggunakan Ruby 2. Juga Anda dapat menggunakan&
sebagai operator set alih-alihtr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 byte disimpan). Dua baris berikutnya dapat digabungkan dengan sesuatu sepertik,m=[1,2].map{t[gets.chop]}
(notechop
ketimbangchomp
).&
juga menghilangkan kebutuhan untukuniq
nanti. Dan halchars
to array juga berlaku untuk baris 6.tr
ke&
saluran 1 tidak berfungsi karenam
tidak dapat dibenarkanuniq
. Namun,k.uniq
dapat disingkat menjadi(k&k)
(1 byte off).C:
495401355341 karakterItu hanya sketsa kasar seperti sekarang. Saya harus bisa mencukur setidaknya seratus karakter.Tujuan tercapai: lebih dari seratus karakter (154 seperti sekarang) secara misterius menghilang dari kode.
Dengan spasi putih yang menyenangkan:
Saya menulis iterasi pertama dari program di ambang tertidur, sehingga memiliki banyak pernyataan yang tidak berarti dan semacamnya. Sebagian besar diperbaiki, tetapi ada beberapa area di mana perbaikan sangat mungkin dilakukan.
sumber
Matlab - 458 karakter
Beberapa contoh:
sumber
Haskell - 711
Demo:
Kode:
Versi besar:
sumber
Pyth - 111
Terlambat untuk berkompetisi, saya hanya ingin berbagi. Ini encoder dan decoder
Penjelasan:
Kunci Sampel / Pesan / Output:
sumber
C, 516
Umpan baris ditambahkan untuk meningkatkan presentasi
keterbacaan. (Ketakutan pergi ke luar jendela, saya rasa.)Contoh:
sumber
Python 3,
709705685664Menerima input dari stdin.
Contoh:
sumber
Python: 591 byte
Ini digunakan
stdin
untuk mendapatkan kunci dan pesan dalam urutan itu. Saya harap tidak curang menggunakan daftar datar untuk menyimpan matriks enkripsi, karena itu membuat bekerja dengan matriks cukup sederhana. Berikut ini beberapa contoh proses:sumber
z
untuklambda x:0if b not in x else b.remove(x)or 1
. Ada juga banyak ruang kosong yang bisa Anda singkirkan. Itu juga akan membiarkan Anda memindahkannya langsung kefilter
panggilan alih-alih mendefinisikannya di luar.Jawa - 791
Golf pertama saya, jadi kritik apa pun diterima. Menggunakan Java karena saya tidak seharusnya. Kelihatannya tidak terlalu buruk; kurang dari dua kali lipat ukuran pemimpin saat ini. Saya mengharapkannya menjadi lebih besar karena, yah, Jawa :)
Dengan format otomatis:
Output sampel:
sumber
JS (node) -
528466Output sampel:
sumber
UU
. Sepertinya ada pengulanganE
yang seharusnya kamu pisah.PHP 582
Dekoder Tidak Terkunci
output
sumber
Perl, 265
Sangat mudah.
Bertakuk:
sumber
CoffeeScript - 610
Demo:
Kode:
Versi tidak disatukan:
sumber