Машина Enigma - це досить складна шифрована машина, яку використовують німці та інші для шифрування своїх повідомлень. Ваша робота з впровадження цієї машини *.
Крок 1, Обертання
Наша машина енігми має 3 гнізда для роторів і 5 доступних роторів для кожного з цих слотів. Кожен ротор має 26 різних можливих положень (від A
до Z
). Кожен ротор має заздалегідь задане положення висічки :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Під час натискання клавіші відбуваються наступні дії:
- Ротор в слоті 1 обертається
- Якщо ротор у гнізді 1 просувається повз його виїмку, то він обертає ротор у слоті 2.
- Якщо ротор у гнізді 2 знаходиться на виїмці (але не просто перемістився туди), обидва ротора 2 і 3 обертаються один раз.
Якщо ми використовуємо ротори 1,3,5 , і вони знаходяться в робочому положенні , P,U,H
то послідовність позицій: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Крок 2, Заміна
Кожен з роторів виконує просту заміну символів. Далі представлена діаграма кожного з роторів у A
положенні:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Ротор 1 у положенні T є PAIBRCJEKMFLGDQVZNTOWYHXUS
, що замінить букву C
на I
.
Після того, як три ротора виконають свою заміну, відбивають рефлектор (перераховано R
вище). Він виконує власну підстановку, а потім відбиває сигнал назад через ротори. Потім ротори виконують зворотну заміну в зворотному порядку.
Оборотні кошти заміни , що замість ротора 1 замінюють A
з E
, вона заміщає E
зA
Прорізи заповнені роторами 1,2,3, всі в положенні A
. Лист Q
простежує шлях Q>X>V>M
через ротори. M
відображає, до O
якого далі йде зворотний шлях O>Z>S>S
. Тому A
заміщений на S
.
Введення-виведення
Вас передають:
- Список 3 роторів (як цілі числа)
- Список 3-х положень старту ротора (як літери)
- Рядок, який потрібно зашифрувати.
Ви можете припустити, що ваш вклад буде добре сформований, а всі символи будуть великими літерами, без пробілів.
Ви повинні повернути зашифрований рядок.
Ви можете додатково прийняти ротори, виїмки та відбивачі як вхідні дані. Для тих, хто не може зняти з балу 95 байт, як95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Тестові справи
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
Мою реалізацію можна знайти на Github . Я перевірив це, але, можливо, у моїй роботі є помилки (це означає, що мої тестові випадки, ймовірно, неправильні).
* Я намагався зробити це максимально точним , але через розбіжності між машинами, я можу помилитися з деякими деталями. Однак ваше завдання - реалізувати те, що я описав, навіть якщо я неточний. Я не включаю плату для простоти