Uma cifra de quatro quadrados mais feroz

17

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:

  1. Mantenha apenas a primeira ocorrência de cada personagem.

  2. 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 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(&<[email protected]@DM%NAC&>

Entrada

& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,

Resultado

GOOD LUCK, HAVE FUN.
Dennis
fonte

Respostas:

4

CJam, 52 50 49 47 46 44 bytes

l2/qN/'[,32>A,s-f|2/f{~@S+2<.#_7f%_W%.m.m.=}

A ordem de entrada é de linhas 5, 2, 3, 1, 4. Experimente online .

(-1 byte graças a @ MartinBüttner, -2 bytes graças a @Dennis)

Explicação

l2/           Read the message and split into chunks of 2
qN/           Read rest of input and split by newlines (pass phrases)
'[,32>        Generate " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
A,s-          Remove digits 0123456789
f|            Setwise OR with each pass phrase to remove duplicates, giving keys
2/            Split keys into two pairs
f{ ... }      For each message chunk...
  ~             Unwrap key pairs
  @S+2<         Add a space to the message chunk then cap to length 2
  .#            Find the two chars in keys 1, 4
  _7f%          Copy indices and perform modulo 7 on both
  _W%           Copy and reverse
  .m.m          Vectorised subtraction twice
  .=            Apply both indices to keys 2, 3

Para os índices, queremos trocar os dígitos menos significativos, base 7. Por exemplo, no primeiro exemplo, ALsão índices 4e 7nas chaves 1 e 4, respectivamente. Na base 7, este é [0 4]e [1 0]. Trocando os dígitos menos significativos dá [0 0]e [1 4], ou seja, 0e 11, e isto corresponde a Pe Pem botões 2 e 3, respectivamente.

No entanto, em vez de converter a base, o código faz o seguinte:

[4 7]     A: Initial indices
[4 0]     B: Indices mod 7
[0 4]     C: Reverse of B

[4 -4]    B-C
[0 11]    A-(B-C)
Sp3000
fonte
6

Pitão, 74 71 bytes

L+%eb7*7/hb7Jcms+oxdN{d--CMr33 91`MTd.z2ssm@VeJ,ydy_dCmxLhdedC,hJ.tcz2d

Provavelmente poderia ser muito otimizado. Eu uso muito o zíper.

Recebe entrada na seguinte ordem:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
fonte
Posso roubar sua ideia de pedido de entrada?
Maltysen
@Maltysen Claro.
orlp 01/08/15
4

Pitão - 88 86 83 78 76 75 72 bytes

8 bytes salvos graças ao @orlp .

Waaay por muito tempo, estou bastante infeliz com isso, mas apenas postando enquanto procuro uma maneira melhor de lidar com os quadrados.

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@[email protected]

Experimente online aqui .

Maltysen
fonte
Você pode substituir c+e.z*%le.z2d2por C.tce.z2d. Não pergunte :)
orlp