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
źródło
Odpowiedzi:
Python 3, 403 bajty
Myślę, że to działa poprawnie. Wirniki przeszły do niego:
f
jest wycięciem,g
wirnikami ih
odbłyśnikiem.Nie golfowany:
Myślę, że to działa, ale daje inny wynik, ponieważ (myślę, że) jest błędem w referencyjnym impl.
źródło