Машина 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 в положении Т 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 . Я проверил это, но у меня могут быть ошибки в моей реализации (что может означать, что мои тестовые примеры, скорее всего, неверны).
* Я пытался сделать это как можно точнее , но из-за различий между машинами у меня могут быть неправильные детали. Однако ваша задача - реализовать то, что я описал, даже если я неточен. Я не включаю плагин для простоты