A máquina Enigma é uma máquina de cifra bastante complexa usada pelos alemães e outros para criptografar suas mensagens. É seu trabalho implementar esta máquina *.
Etapa 1, rotação
Nossa máquina enigma possui 3 slots para rotores e 5 rotores disponíveis para cada um desses slots. Cada rotor possui 26 posições possíveis diferentes (de A
a Z
). Cada rotor tem uma posição de entalhe predefinida :
Rotor Notch
------------
1 Q
2 E
3 V
4 J
5 Z
Ao pressionar a tecla, ocorrem as seguintes etapas:
- O rotor no slot 1 gira
- Se o rotor no slot 1 ultrapassar o entalhe, ele girará o rotor no slot 2.
- Se o rotor no slot 2 estiver no seu entalhe (mas não se moveu apenas para lá), os rotores 2 e 3 giram uma vez.
Se estamos usando rotores 1,3,5 e eles estão em posições P,U,H
então a sequência de posições é: P,U,H
> Q,U,H
> R,V,H
>S,W,I
Etapa 2, Substituição
Cada um dos rotores realiza uma substituição simples de caracteres. A seguir, é apresentado um gráfico de cada um dos rotores na A
posição:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
--------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT
Rotor 1 na posição T é PAIBRCJEKMFLGDQVZNTOWYHXUS
, que substitua a letra C
para I
.
Depois que os três rotores executam sua substituição, o refletor é atingido (listado como R
acima). Ele realiza sua própria substituição e reflete o sinal de volta através dos rotores. Os rotores executam uma substituição reversa na ordem inversa.
Meios de substituição inversa que, em vez de rotor 1, substituindo A
com E
, ela substitui E
comA
Os slots são preenchidos com rotores 1,2,3, todos em posição A
. A letra Q
segue o caminho Q>X>V>M
através dos rotores. M
reflete para O
, que segue o caminho reverso de O>Z>S>S
. Portanto, A
é substituído por S
.
Entrada / Saída
Você passou:
- Uma lista de 3 rotores (como números inteiros)
- Uma lista de 3 posições iniciais do rotor (como letras)
- Uma sequência que precisa ser criptografada.
Você pode assumir que sua entrada será bem formada e todos os caracteres serão maiúsculos, sem espaços.
Você deve retornar a sequência criptografada.
Opcionalmente, você pode aceitar os rotores, entalhes e refletores como entrada. Para aqueles que não conseguem tirar 95 bytes de sua pontuação, como95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)
Casos de teste
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
Minha implementação pode ser encontrada no Github . Eu testei, mas posso ter erros na minha implementação (o que significa que meus casos de teste provavelmente estão errados).
* Tentei fazer isso o mais preciso possível , mas devido às variações entre as máquinas, posso ter alguns detalhes incorretos. No entanto, sua tarefa é implementar o que descrevi, mesmo que eu seja impreciso. Não incluo o painel por simplicidade
fonte
Respostas:
Python 3, 403 bytes
Eu acho que isso está funcionando corretamente. Os rotores passaram para ele:
f
é o entalhe,g
são os rotores eh
é o refletor.Ungolfed:
Eu acho que isso está funcionando, mas produz uma saída diferente, devido ao que (acho) é um bug no impl de referência.
fonte