Maszyna Enigma to dość złożona maszyna szyfrująca używana przez Niemców i innych do szyfrowania ich wiadomości. Twoim zadaniem jest wdrożenie tego urządzenia *.
Krok 1, obrót
Nasza maszyna enigma ma 3 gniazda na rotory i 5 dostępnych rotorów dla każdego z tych gniazd. Każdy wirnik ma 26 różnych możliwych pozycji (od A
do Z
). Każdy wirnik ma wstępnie zdefiniowaną pozycję wycięcia :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Po naciśnięciu klawisza wykonywane są następujące kroki:
- Wirnik w gnieździe 1 obraca się
- Jeśli wirnik w gnieździe 1 przesunie się poza swoje wycięcie, obraca wirnik w gnieździe 2.
- Jeśli wirnik w gnieździe 2 znajduje się w wycięciu (ale nie tylko się tam poruszył), zarówno wirnik 2, jak i 3 obracają się raz.
Jeśli używamy wirników 1,3,5 i są w pozycjach P,U,H
następnie kolejność pozycji jest: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Krok 2, Zmiana
Każdy z wirników wykonuje prostą zamianę postaci. Poniżej znajduje się tabela każdego z wirników w A
położeniu:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Wirnik 1 w pozycji T znajduje się PAIBRCJEKMFLGDQVZNTOWYHXUS
, co zastąpiłoby literęC
do I
.
Po tym, jak trzy wirniki dokonają zamiany, reflektor zostaje trafiony (wymieniony jakoR
powyżej). Dokonuje własnego zastąpienia, a następnie odbija sygnał z powrotem przez wirniki. Wirniki wykonują następnie zamianę w odwrotnej kolejności w odwrotnej kolejności.
Odwracalne oznacza podstawienie, że zamiast wirnika 1, zastępując A
w E
, zastępuje E
sięA
Szczeliny są wypełnione wirnikami 1,2,3 we wszystkich pozycjach A
. Litera Q
podąża ścieżką Q>X>V>M
przez wirniki. M
odzwierciedla O
, który następnie podąża odwrotną ścieżką O>Z>S>S
. Dlatego A
jest zastąpiony przez S
.
Wejście wyjście
Jesteś zaliczony:
- Lista 3 wirników (jako liczb całkowitych)
- Lista 3 początkowych pozycji wirnika (jako litery)
- Ciąg, który należy zaszyfrować.
Możesz założyć, że dane wejściowe będą dobrze sformułowane, a wszystkie znaki będą pisane wielkimi literami, bez spacji.
Musisz zwrócić zaszyfrowany ciąg.
Opcjonalnie możesz zaakceptować rotory, wycięcia i odbłyśniki jako dane wejściowe. Dla tych, którzy nie mogą zdjąć 95 bajtów ze swojego wyniku, as95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Przypadki testowe
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
Moje wdrożenie można znaleźć na Github . Testowałem to, ale mogę mieć błędy w mojej implementacji (co oznaczałoby, że moje przypadki testowe są prawdopodobnie błędne).
* Starałem się, aby było to jak najdokładniejsze , ale ze względu na różnice między maszynami, niektóre szczegóły mogą być nieprawidłowe. Twoim zadaniem jest jednak wdrożenie tego, co opisałem, nawet jeśli jestem niedokładny. Dla uproszczenia nie dołączam wtyczki