La machine Enigma est une machine de chiffrement assez complexe utilisée par les Allemands et d'autres pour crypter leurs messages. Il vous appartient de mettre en œuvre cette machine *.
Étape 1, rotation
Notre machine à énigmes dispose de 3 emplacements pour les rotors et de 5 rotors disponibles pour chacun de ces emplacements. Chaque rotor a 26 positions différentes possibles (de A
à Z
). Chaque rotor a une position d'encoche prédéfinie :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Lorsque vous appuyez sur une touche, les étapes suivantes se produisent:
- Le rotor de l'emplacement 1 tourne
- Si le rotor de l'emplacement 1 dépasse son encoche, il fait tourner le rotor de l'emplacement 2.
- Si le rotor de la fente 2 est dans son encoche (mais ne s'y est pas simplement déplacé), les rotors 2 et 3 tournent une fois.
Si nous utilisons des rotors 1,3,5 et ils sont dans des positions P,U,H
alors la séquence des positions est: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Étape 2, substitution
Chacun des rotors effectue une substitution de caractère simple. Ce qui suit est un diagramme de chacun des rotors dans la A
position:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Rotor 1 en position T est PAIBRCJEKMFLGDQVZNTOWYHXUS
, qui remplacerait la lettre C
pour I
.
Une fois que les trois rotors ont effectué leur remplacement, le réflecteur est touché (comme indiqué R
ci-dessus). Il effectue sa propre substitution, puis renvoie le signal à travers les rotors. Les rotors effectuent ensuite une substitution inverse dans l'ordre inverse.
La substitution inverse signifie qu'au lieu de remplacer le rotor 1 A
par E
, il remplace E
parA
Les fentes sont remplies de rotors 1,2,3 tous en position A
. La lettre Q
suit le chemin à Q>X>V>M
travers les rotors. M
se reflète sur O
, qui suit ensuite le chemin inverse de O>Z>S>S
. Par conséquent, A
est remplacé par S
.
Entrée sortie
Vous êtes dépassé:
- Une liste de 3 rotors (sous forme d'entiers)
- Une liste de 3 positions de démarrage du rotor (en lettres)
- Une chaîne qui doit être chiffrée.
Vous pouvez supposer que votre entrée sera bien formée et que tous les caractères seront en majuscules, sans espaces.
Vous devez renvoyer la chaîne chiffrée.
Vous pouvez éventuellement accepter les rotors, les encoches et les réflecteurs en entrée. Pour ceux qui ne peuvent pas retirer 95 octets de leur score, comme95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Cas de test
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
Mon implémentation se trouve sur Github . Je l'ai testé, mais je peux avoir des bogues dans mon implémentation (ce qui signifierait que mes cas de test sont probablement faux).
* J'ai essayé de rendre cela aussi précis que possible , mais en raison des variations entre les machines, j'ai peut-être des détails erronés. Cependant, votre tâche consiste à mettre en œuvre ce que j'ai décrit, même si je suis inexact. Je n'inclus pas le plugboard pour plus de simplicité
la source
Réponses:
Python 3, 403 octets
Je pense que cela fonctionne correctement. Les rotors lui sont passés:
f
est l'encoche,g
les rotors eth
le réflecteur.Non golfé:
Je pense que cela fonctionne, mais cela produit une sortie différente, en raison de ce qui (je pense) est un bogue dans l'impl de référence.
la source