La máquina Enigma es una máquina de cifrado bastante compleja utilizada por los alemanes y otros para cifrar sus mensajes. Es su trabajo implementar esta máquina *.
Paso 1, rotación
Nuestra máquina enigma tiene 3 ranuras para rotores y 5 rotores disponibles para cada una de estas ranuras. Cada rotor tiene 26 posiciones posibles diferentes (de A
a Z
). Cada rotor tiene una posición de muesca predefinida :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Al presionar una tecla se producen los siguientes pasos:
- El rotor en la ranura 1 gira
- Si el rotor en la ranura 1 se mueve más allá de su muesca, entonces gira el rotor en la ranura 2.
- Si el rotor en la ranura 2 está en su muesca (pero no solo se movió allí), tanto el rotor 2 como el 3 giran una vez.
Si estamos utilizando rotores 1,3,5 y están en posiciones P,U,H
entonces la secuencia de posiciones es: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Paso 2, sustitución
Cada uno de los rotores realiza una simple sustitución de caracteres. La siguiente es una tabla de cada uno de los rotores en la A
posición:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Rotor 1 en posición T es PAIBRCJEKMFLGDQVZNTOWYHXUS
, que sustituya la letra C
a I
.
Después de que los tres rotores realizan su sustitución, el reflector es golpeado (como se indica R
arriba). Realiza su propia sustitución y luego refleja la señal a través de los rotores. Los rotores realizan una sustitución inversa en orden inverso.
Sustitución inversa significa que, en lugar de sustituir el rotor 1 A
con E
, sustituye E
conA
Las ranuras están llenas de rotores 1,2,3 todos en posición A
. La carta Q
sigue el camino a Q>X>V>M
través de los rotores. M
refleja a O
, que luego sigue el camino inverso de O>Z>S>S
. Por lo tanto, A
se sustituye con S
.
De entrada y salida
Ya pasaste:
- Una lista de 3 rotores (como enteros)
- Una lista de 3 posiciones iniciales del rotor (como letras)
- Una cadena que necesita ser encriptada.
Puede suponer que su entrada estará bien formada y que todos los caracteres serán letras mayúsculas, sin espacios.
Debe devolver la cadena encriptada.
Opcionalmente, puede aceptar los rotores, muescas y reflectores como entrada. Para aquellos que no pueden quitar 95 bytes de su puntaje, como95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Casos de prueba
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
Mi implementación se puede encontrar en Github . Lo he probado, pero puedo tener errores en mi implementación (lo que significaría que mis casos de prueba probablemente estén equivocados).
* He tratado de hacer esto lo más preciso posible , pero debido a las variaciones entre máquinas, puedo tener algunos detalles incorrectos. Sin embargo, su tarea es implementar lo que he descrito, incluso si no soy exacto. No incluyo el panel de conexiones por simplicidad
fuente
Respuestas:
Python 3, 403 bytes
Creo que esto está funcionando correctamente. Los rotores le pasaron:
f
es la muesca,g
son los rotores yh
es el reflector.Sin golf:
Creo que esto está funcionando, pero produce una salida diferente, debido a lo que (creo) es un error en la referencia impl.
fuente