Kicker samar
Metode enkripsi teks yang umum tetapi tidak aman adalah dengan mengubah huruf alfabet. Dengan kata lain, setiap huruf alfabet secara konsisten diganti dalam teks dengan beberapa huruf lainnya. Untuk memastikan bahwa enkripsi dapat dibalik, tidak ada dua huruf yang diganti dengan huruf yang sama. Tugas Anda adalah mendekripsi beberapa baris teks yang disandikan, dengan asumsi bahwa setiap baris menggunakan serangkaian penggantian yang berbeda, dan bahwa semua kata dalam teks yang didekripsi tersebut berasal dari kamus kata-kata yang dikenal.
Memasukkan
Input terdiri dari kata-kata kecil, dalam urutan abjad. Kata-kata ini menyusun kamus kata-kata yang mungkin muncul dalam teks yang didekripsi. Mengikuti kamus adalah beberapa baris input. Setiap baris dienkripsi seperti dijelaskan di atas.
Tidak ada lebih dari 1.000 kata dalam kamus. Tidak ada kata yang melebihi 16 huruf. Baris terenkripsi hanya berisi huruf kecil dan spasi dan panjangnya tidak lebih dari 80 karakter.
Keluaran
Dekripsi setiap baris dan cetak ke output standar. Jika ada beberapa solusi, ada yang akan melakukannya. Jika tidak ada solusi, ganti setiap huruf dari alfabet dengan tanda bintang.
Input Sampel
and dick jane puff spot yertle
bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd
Output Sampel
dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******
Inilah solusinya. Harap dicatat bahwa saya bukan kuda yang berlari dalam perlombaan untuk byte / programmer Kompetitif terpendek . Saya suka puzzle!
( Sumber )
sumber
Jawaban:
Python 3, 423 byte
Membaca input dari STDIN dan menulis output ke STDOUT, menggunakan format yang sama dengan input / output sampel.
Penjelasan
Untuk setiap baris ciphertext, kami melakukan prosedur berikut:
Kami menyimpan peta, M , dari semua transformasi huruf yang telah kami buat (yang awalnya kosong). Kami melakukannya sedemikian rupa sehingga huruf sumber semuanya huruf kecil dan huruf tujuan semua huruf besar.
Kami memproses kata-kata dalam ciphertext secara berurutan. Untuk setiap kata, kami menemukan semua kata dalam kamus yang cocok, sebagai berikut:
Misalkan kata kita, w , adalah
glpplppljjl
dan bahwa M mengandung aturanj -> P
. Kami pertama-tama mengubah w menggunakan aturan yang ada di M , dapatkanglpplpplPPl
. Kami kemudian mengubah w menjadi regex rasa python berikut:Aturan transformasi adalah sebagai berikut:
x
,, diganti dengan . Ini mendefinisikan kelompok tangkapan bernama, yang disebut , yang cocok dengan cahracter tunggal.(?P<
x
>.)
x
x
,, diganti dengan . Ini adalah referensi kembali ke karakter yang sebelumnya ditangkap oleh grup yang disebutkan .(?P=
x
)
x
Kami melakukan transformasi ini dengan membalikkan w , lalu menerapkan dua pergantian regex berikut:
dan kemudian membalikkan hasilnya. Perhatikan bahwa karakter yang sebelumnya diubah oleh M muncul sebagai huruf besar, dan oleh karena itu tetap tidak berubah.
Kami mencocokkan regex yang dihasilkan dengan masing-masing kata kamus, di mana kata-kata kamus muncul sebagai huruf besar. Misalnya, regex di atas akan cocok dengan kata
MISSISSIPPI
. Jika kita menemukan kecocokan, kita mengekstrak aturan transformasi baru dari itu, dan menambahkannya ke M . Aturan transformasi baru hanyalah karakter yang ditangkap oleh masing-masing kelompok tangkapan. Di regex di atas, grupg
cocokM
, grupl
cocokI
, dan grupp
cocokS
, memberi kami aturang -> M, l -> I, p -> S
. Kita harus memastikan bahwa aturan yang dihasilkan konsisten, yaitu, bahwa tidak ada dua huruf sumber yang dipetakan ke surat tujuan yang sama; jika tidak, kami menolak pertandingan.Kami kemudian melanjutkan ke kata berikutnya, menggunakan aturan transformasi augmented. Jika kami dapat mencocokkan semua kata ciphertext menggunakan proses ini, kami telah mendekripsi teksnya. Jika kami tidak dapat mencocokkan kata dengan kata-kata kamus, kami mundur dan mencoba untuk mencocokkan kata-kata sebelumnya dengan kata-kata kamus yang berbeda. Jika proses ini gagal, tidak ada solusi, dan kami mencetak deretan tanda bintang.
sumber
CJam,
6256 byteCukup lambat dan memori haus, tetapi bekerja untuk test case dengan Java interpreter.
Contoh dijalankan
sumber