Die Enigma-Maschine ist eine ziemlich komplexe Verschlüsselungsmaschine, mit der die Deutschen und andere ihre Nachrichten verschlüsseln. Es ist Ihre Aufgabe, diese Maschine * zu implementieren.
Schritt 1, Drehung
Unsere Enigma-Maschine hat 3 Schlitze für Rotoren und 5 verfügbare Rotoren für jeden dieser Schlitze. Jeder Rotor hat 26 verschiedene mögliche Positionen (von A
bis Z
). Jeder Rotor hat eine vordefinierte Kerbposition :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Bei Tastendruck werden folgende Schritte ausgeführt:
- Der Rotor in Steckplatz 1 dreht sich
- Wenn sich der Rotor in Steckplatz 1 über seine Kerbe hinaus bewegt, dreht er den Rotor in Steckplatz 2.
- Wenn sich der Rotor in Schlitz 2 in seiner Kerbe befindet (sich aber nicht gerade dort bewegt hat), drehen sich beide Rotoren 2 und 3 einmal.
Wenn wir Rotoren sind mit 1,3,5 und sie sind in Positionen P,U,H
dann die Positionen der Sequenz ist: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Schritt 2, Substitution
Jeder der Rotoren führt eine einfache Zeichenersetzung durch. Das Folgende ist ein Diagramm von jedem der Rotoren in der A
Position:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Der Rotor 1 in Position T ist PAIBRCJEKMFLGDQVZNTOWYHXUS
, die die Buchstaben ersetzen würde C
für I
.
Nachdem die drei Rotoren ausgetauscht wurden, wird der Reflektor getroffen (wie R
oben aufgeführt). Es führt eine eigene Substitution durch und reflektiert dann das Signal über die Rotoren zurück. Die Rotoren führen dann einen umgekehrten Austausch in umgekehrter Reihenfolge durch.
Reverse Substitution bedeutet , dass statt des Rotors 1 substituierende A
mit E
, ersetzt es E
mitA
Die Schlitze sind mit Rotoren 1,2,3 gefüllt, die alle in Position sind A
. Der Buchstabe Q
folgt dem Weg Q>X>V>M
durch die Rotoren. M
reflektiert O
, der dann den umgekehrten Weg von folgt O>Z>S>S
. Daher A
wird mit ersetzt S
.
Input-Output
Sie sind bestanden:
- Eine Liste von 3 Rotoren (als ganze Zahlen)
- Eine Liste von 3 Startrotorpositionen (als Buchstaben)
- Eine Zeichenfolge, die verschlüsselt werden muss.
Sie können davon ausgehen, dass Ihre Eingabe wohlgeformt ist und alle Zeichen aus Großbuchstaben ohne Leerzeichen bestehen.
Sie müssen die verschlüsselte Zeichenfolge zurückgeben.
Optional können Sie die Rotoren, Kerben und Reflektoren als Eingabe akzeptieren. Für diejenigen, die nicht 95 Bytes von ihrer Punktzahl abziehen können, wie95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Testfälle
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
Meine Implementierung ist auf Github zu finden . Ich habe es getestet, habe aber möglicherweise Fehler in meiner Implementierung (was bedeuten würde, dass meine Testfälle wahrscheinlich falsch sind).
* Ich habe versucht, dies so genau wie möglich zu machen , aber aufgrund der Unterschiede zwischen den Maschinen kann es sein, dass einige Details falsch sind. Ihre Aufgabe ist es jedoch, das, was ich beschrieben habe, auch dann umzusetzen, wenn ich ungenau bin. Der Einfachheit halber schließe ich das Plugboard nicht ein
quelle
Antworten:
Python 3, 403 Bytes
Ich denke das funktioniert richtig. Die Rotoren gingen darauf über:
f
ist die Kerbe,g
ist die Rotoren undh
ist der Reflektor.Ungolfed:
Ich denke, das funktioniert, aber es erzeugt eine andere Ausgabe, weil (ich denke) ein Fehler im Referenz-Impl vorliegt.
quelle