La macchina Enigma è una macchina di cifratura abbastanza complessa utilizzata dai tedeschi e da altri per crittografare i loro messaggi. Il tuo compito è implementare questa macchina *.
Passaggio 1, rotazione
La nostra macchina per enigmi ha 3 slot per rotori e 5 rotori disponibili per ciascuno di questi slot. Ogni rotore ha 26 diverse posizioni possibili (da A
a Z
). Ogni rotore ha una posizione di tacca predefinita :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Alla pressione dei tasti si verificano i seguenti passaggi:
- Il rotore nello slot 1 ruota
- Se il rotore nello slot 1 si sposta oltre la sua tacca, quindi ruota il rotore nello slot 2.
- Se il rotore nello slot 2 è nella sua tacca (ma non si è semplicemente spostato lì), entrambi i rotori 2 e 3 ruotano una volta.
Se stiamo usando rotori 1,3,5 e sono in posizioni P,U,H
allora la sequenza di posizioni è: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Passaggio 2, Sostituzione
Ciascuno dei rotori esegue una semplice sostituzione del carattere. Di seguito è riportato un grafico di ciascuno dei rotori nella A
posizione:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Rotore 1 in posizione T è PAIBRCJEKMFLGDQVZNTOWYHXUS
, che sostituire la lettera C
per I
.
Dopo che i tre rotori eseguono la loro sostituzione, il riflettore viene colpito (elencato come R
sopra). Esegue la propria sostituzione e quindi riflette il segnale indietro attraverso i rotori. I rotori eseguono quindi una sostituzione inversa in ordine inverso.
Sostituzione inversa significa che invece di sostituire il Rotore 1 A
con E
, sostituisce E
conA
Gli slot sono riempiti con rotori 1,2,3 tutti in posizione A
. La lettera Q
segue il percorso Q>X>V>M
attraverso i rotori. M
riflette a O
, che segue quindi il percorso inverso di O>Z>S>S
. Pertanto, A
viene sostituito con S
.
Input Output
Sei passato:
- Un elenco di 3 rotori (come numeri interi)
- Un elenco di 3 posizioni iniziali del rotore (come lettere)
- Una stringa che deve essere crittografata.
Puoi presumere che il tuo input sarà ben formato e che tutti i caratteri saranno lettere maiuscole, senza spazi.
È necessario restituire la stringa crittografata.
È possibile accettare facoltativamente rotori, tacche e riflettori come input. Per quelli che non lo fanno possono togliere 95 byte dal loro punteggio, come95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Casi 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
La mia implementazione può essere trovata su Github . L'ho provato, ma potrei avere dei bug nella mia implementazione (il che significherebbe che i miei casi di test sono probabilmente sbagliati).
* Ho provato a renderlo il più preciso possibile , ma a causa delle variazioni tra le macchine, potrei avere alcuni dettagli sbagliati. Tuttavia, il tuo compito è quello di implementare ciò che ho descritto, anche se sono impreciso. Non includo il plugboard per semplicità