Escreva um programa que use duas linhas de entrada e use a primeira como uma frase-chave para criptografar a segunda de acordo com a técnica de criptografia da Playfair.
A Wikipedia descreve a criptografia Playfair com mais detalhes , mas para evitar qualquer ambiguidade, aqui está um breve resumo:
1. Gere uma tabela de chaves:
Substitua todas as ocorrências de J
na frase-chave por I
e retire todos os caracteres que não sejam do alfabeto e caracteres repetidos. Insira em uma tabela de criptografia 5 × 5, preenchendo as células restantes com o restante do alfabeto (exceto J
; não gostamos J
).
Exemplo:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Prepare a mensagem a ser criptografada
Substitua todos J
por um I
, retire todos os caracteres que não sejam do alfabeto e divida-os em pares, usando a X
para quebrar qualquer par que contenha a mesma letra duas vezes. Se você terminar com um número ímpar de letras, adicione X
no final. (Nota: numerais tem que ser explicitada na íntegra - ONE
, TWO
,THREE
, etc. - mas você pode assumir isso já foi feito para você.)
Exemplo:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Criptografia
Criptografe cada par de letras por vez. Se eles estiverem em diferentes linhas e colunas da tabela de chaves, substitua cada um pela letra da mesma linha na coluna em que a outra letra é encontrada (por exemplo, VM
⇒ EI
, LZ
⇒ GQ
). Se eles estiverem na mesma linha (ou coluna), escolha os dois caracteres imediatamente à direita (ou abaixo), contornando, se necessário (por exemplo, OE
⇒ VR
, ZG
⇒ KP
).
Exemplo:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
A cadeia produzida por esse processo é a mensagem criptografada, que seu programa deve gerar.
Regras:
- O texto e a chave de entrada podem ser obtidos em
stdin
argumentos de linha de comando ou em outras fontes. Entrada codificada não é permitida. - Seu programa deve aceitar texto em maiúsculas e minúsculas para a frase secreta e a mensagem.
- A saída criptografada pode ser maiúscula ou minúscula.
- Seu programa deve aceitar frases-chave de pelo menos 64 caracteres e textos de mensagens de pelo menos 16 KB.
- Você não precisa lidar com entrada não-ASCII.
- Você pode ignorar a possibilidade do par de letras
XX
ocorrer durante a criptografia. - Não há necessidade de adicionar espaço em branco à saída do programa.
- Sua resposta deve incluir um exemplo de mensagem, frase-chave e saída criptografada produzida pelo seu programa.
- Este é um desafio de código de golfe, portanto a resposta com o código mais curto (em bytes) vencerá.
NOTA: Lembre-se de que você só precisa quebrar letras consecutivas se elas aparecerem no mesmo par . Por exemplo,
MASSACHUSETTS
deve ser criptografado comoMA SX SA CH US ET TS
- o dobroS
deve ser dividido, mas o dobroT
não.
fonte
J
" Você nutre sentimentos semelhantes sobre o APL?Respostas:
JI *,536431417380263218203197186167(com sugestões extensivas de @algorithmshark)
exemplo de uso:
divide a entrada corretamente:
* substitua todos
J
por umI
, certo?fonte
Ruby,
461411366359352346330 caracteresObrigado a @daniero por salvar ... muitos erros . \ o /
Aqui está o código não destruído:
Aqui estão alguns exemplos de saídas:
fonte
chars
em uma matriz, supondo que você esteja usando o Ruby 2. Além disso, você pode usar&
como um operador de conjunto em vez detr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 bytes salvos). As duas próximas linhas podem ser unidas com algo comok,m=[1,2].map{t[gets.chop]}
(observe emchop
vez dechomp
).&
também elimina a necessidade deuniq
mais tarde. E ochars
a gama coisa também se aplica a linha 6.tr
a&
linha 1 não funciona porquem
não pode seruniq
ignorada. No entanto,k.uniq
pode ser reduzido para(k&k)
(1 byte desativado).C:
495401355341 caracteresÉ apenas um esboço aproximado a partir de agora. Eu deveria ser capaz de cortar pelo menos cem caracteres.Objetivo atingido: mais de cem caracteres (154 a partir de agora) desapareceram misteriosamente do código.
Com algum espaço em branco agradável:
Eu escrevi a primeira iteração do programa a ponto de adormecer, por isso tinha muitas declarações supérfluas e sem sentido. A maior parte disso é retificada, mas há algumas áreas em que a melhoria é definitivamente possível.
fonte
Matlab - 458 caracteres
Alguns exemplos:
fonte
Haskell - 711
Demo:
Código:
Versão grande:
fonte
Pitão - 111
Tarde demais para competir, eu só queria compartilhar. Aqui está o codificador e decodificador
Explicação:
Chave de amostra / mensagem / saída:
fonte
C, 516
Linefeeds adicionados para melhor apresentação da
legibilidade. (A legibilidade saiu pela janela, receio.)Exemplo:
fonte
Python 3,
709705685664Aceita entrada de stdin.
Exemplo:
fonte
Python: 591 bytes
Isso usa
stdin
para obter a chave e a mensagem nessa ordem. Espero que não seja trapaça usar uma lista simples para armazenar a matriz de criptografia, porque isso simplificou bastante o trabalho com a matriz. Aqui estão alguns exemplos de execuções:fonte
z
paralambda x:0if b not in x else b.remove(x)or 1
. Também há bastante espaço em branco do qual você pode se livrar. Isso também permitiria movê-lo diretamente para afilter
chamada em vez de defini-la para fora.Java - 791
Meu primeiro golfe, então qualquer crítica é bem-vinda. Usando Java porque eu não deveria. Não parece tão ruim; menos que o dobro do tamanho do líder atual. Eu esperava que fosse maior, já que é, bem, Java :)
Com formato automático:
Saída de amostra:
fonte
JS (nó) -
528466Saída de amostra:
fonte
UU
. Parece que houve uma repetiçãoE
que você deveria ter dividido.PHP 582
Decodificador Ungolfed
saídas
fonte
Perl, 265
Muito simples.
Recuado:
fonte
CoffeeScript - 610
Demo:
Código:
Versão não destruída:
fonte