Mesin Enigma adalah mesin sandi yang cukup rumit yang digunakan oleh orang Jerman dan lainnya untuk mengenkripsi pesan mereka. Adalah tugas Anda untuk mengimplementasikan mesin ini *.
Langkah 1, Rotasi
Mesin enigma kami memiliki 3 slot untuk rotor, dan 5 rotor yang tersedia untuk masing-masing slot ini. Setiap rotor memiliki 26 posisi yang berbeda (dari A
ke Z
). Setiap rotor memiliki posisi takik yang telah ditentukan :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Pada penekanan tombol, langkah-langkah berikut terjadi:
- Rotor di Slot 1 berputar
- Jika rotor di Slot 1 bergerak melewati takiknya, maka rotor diputar di Slot 2.
- Jika rotor di Slot 2 berada di tingkatnya (tetapi tidak hanya bergerak di sana), rotor 2 dan 3 berputar sekali.
Jika kita menggunakan rotor 1,3,5 dan mereka berada di posisi P,U,H
maka urutan posisi adalah: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Langkah 2, Substitusi
Setiap rotor melakukan penggantian karakter sederhana. Berikut ini adalah bagan dari masing-masing rotor pada A
posisi:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Rotor 1 pada posisi T adalah PAIBRCJEKMFLGDQVZNTOWYHXUS
, yang akan menggantikan huruf C
untuk I
.
Setelah ketiga rotor melakukan pergantian, reflektor dipukul (terdaftar seperti di R
atas). Ia melakukan substitusi sendiri, dan kemudian memantulkan kembali sinyal melalui rotor. Rotor kemudian melakukan penggantian terbalik dengan urutan terbalik.
Substitusi terbalik berarti bahwa alih-alih Rotor 1 menggantikan A
dengan E
, itu menggantikan E
denganA
Slot diisi dengan rotor 1,2,3 semuanya ada di posisinya A
. Surat itu Q
mengikuti jalan Q>X>V>M
melalui rotor. M
mencerminkan O
, yang kemudian mengikuti jalur kebalikan dari O>Z>S>S
. Oleh karena itu, A
diganti dengan S
.
Input output
Anda lulus:
- Daftar 3 rotor (sebagai bilangan bulat)
- Daftar 3 posisi awal rotor (sebagai huruf)
- Sebuah string yang perlu dienkripsi.
Anda dapat mengasumsikan bahwa input Anda akan terbentuk dengan baik, dan semua karakter akan menjadi huruf besar, tanpa spasi.
Anda harus mengembalikan string terenkripsi.
Anda secara opsional dapat menerima rotor, takik, dan reflektor sebagai input. Bagi mereka yang tidak dapat melepas 95 byte dari skor mereka, sebagai95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Uji kasus
Rotor Position Input Output
4,1,5 H,P,G AAAAAAAAA RPWKMBZLN
1,2,3 A,A,A PROGRAMMINGPUZZLES RTFKHDOVZSXTRMVPFC
1,2,3 A,A,A RTFKHDOVZSXTRMVPFC PROGRAMMINGPUZZLES
2,5,3 U,L,I GIBDZNJLGXZ UNCRACKABLE
Implementasi saya dapat ditemukan di Github . Saya telah mengujinya, tetapi saya mungkin memiliki bug dalam implementasi saya (yang berarti bahwa kasus pengujian saya kemungkinan salah).
* Saya sudah mencoba membuat ini seakurat mungkin , tetapi karena variasi antar mesin, saya mungkin memiliki beberapa detail yang salah. Namun, tugas Anda adalah mengimplementasikan apa yang telah saya jelaskan, bahkan jika saya tidak akurat. Saya tidak termasuk plugboard untuk kesederhanaan
sumber
Jawaban:
Python 3, 403 byte
Saya pikir ini berfungsi dengan benar. Rotor diteruskan ke sana:
f
adalah takik,g
adalah rotor danh
reflektor.Tidak Disatukan:
Saya pikir ini berfungsi, tetapi menghasilkan output yang berbeda, karena apa (saya pikir) adalah bug dalam referensi impl.
sumber