fundo
Cento e treze anos atrás, o criptógrafo amador Félix Delastelle publicou seu trabalho na cifra de quatro quadrados , uma cifra de substituição digográfica que aceita duas permutações de um alfabeto de 25 letras como chaves e codifica mensagens que consistem nessas letras.
Como a maioria das cifras de papel e caneta, a cifra de quatro quadrados não possui nenhum valor criptográfico atualmente, mas, no momento de sua invenção, ela possuía uma vantagem significativa sobre suas contrapartes monográficas.
Cento e treze anos depois, Alice Delastelle decide melhorar a cifra de quatro quadrados, aumentando o tamanho do alfabeto e o número de chaves. [citação necessária]
Configuração de chave
O alfabeto contém os seguintes caracteres (começando com espaço):
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
Dada uma frase secreta, construímos uma permutação desse alfabeto da seguinte maneira:
Mantenha apenas a primeira ocorrência de cada personagem.
Anexe os caracteres não utilizados do alfabeto, em sua ordem natural.
Depois de transformar quatro frases secretas em quatro chaves, dividimos cada chave em um quadrado de comprimento lateral 7 e organizamos os quatro quadrados resultantes para que eles formem um quadrado grande.
Por exemplo, se as frases secretas fossem
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
as chaves seriam construídas e organizadas assim:
PROGAMI POULARI
N UZLES TY CNES
&CDF!"# &DBWG!"
$%'()*+ #$%'()*
,-./:;< +,-./:;
=>?@BHJ <=>?@FH
KQTVWXY JKMQVXZ
CORET H DON'T E
SBAYPL! LV!"#$%
"#$%&'( &()*+,-
)*+,-./ ./:;<=>
:;<=>?@ ?@ABCFG
DFGIJKM HIJKMPQ
NQUVWXZ RSUWXYZ
Criptografia
Dada uma mensagem de texto simples como
ALICE LOVES BOB.
anexamos 0 ou 1 espaços para uniformizar o comprimento e dividimos em pares de caracteres:
["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]
Para cada par de caracteres, localizamos o primeiro caractere no primeiro quadrado (ordem de leitura) e o segundo no quarto.
Em seguida, escolhemos os caracteres nos quadrados restantes, de modo que os quatro caracteres selecionados formem um retângulo cujos lados sejam paralelos aos lados dos quadrados.
Por fim, substituímos o par de caracteres pelos caracteres selecionados do segundo e terceiro quadrado.
Para nosso exemplo de string, isso gera
["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]
resultando no seguinte texto cifrado:
PPA@E YTZEEH=T<-
Tarefa
Escreva um programa ou função que aceite quatro frases secretas e um texto sem formatação, use a variante acima da cifra de quatro quadrados para criptografá-la e retorne o texto cifrado resultante.
Detalhes:
As cinco seqüências de entrada consistirão apenas em caracteres do alfabeto mencionado.
As cinco cadeias de entrada podem ser lidas em qualquer ordem, como tal, uma única cadeia delimitada por novas linhas ou como uma matriz de cinco cadeias.
Você pode assumir que nenhuma das strings está vazia.
A saída deve ser uma única sequência.
Se você optar por imprimir a saída em STDOUT, poderá imprimir apenas os caracteres do texto cifrado e (opcionalmente) uma nova linha à direita.
Aplicam-se as regras de código-golfe padrão .
Casos de teste
Em todos os casos de teste, as quatro primeiras cadeias correspondem aos quadrados das chaves na ordem de leitura e a última cadeia de entrada ao texto sem formatação.
Entrada
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.
Resultado
PPA@E YTZEEH=T<-
Entrada
!"#$%&'()*+,-./:;<=>
!"#$%&'()*+,-./:;<=>?@ABCDE
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD!
Resultado
LALLR)#TROKE !
Entrada
,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!
Resultado
#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>
Entrada
& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,
Resultado
GOOD LUCK, HAVE FUN.