Una cifra de cuatro cuadrados más feroz

17

Antecedentes

Hace ciento trece años, el criptógrafo aficionado Félix Delastelle publicó su trabajo sobre el cifrado de cuatro cuadrados , un cifrado de sustitución digráfica que acepta dos permutaciones de un alfabeto de 25 letras como claves y codifica mensajes que consisten en esas letras.

Como la mayoría de las cifras de lápiz y papel, la cifra de cuatro cuadrados no tiene ningún valor criptográfico en la actualidad, pero en el momento de su invención, tenía una ventaja significativa sobre sus contrapartes monográficas.

Ciento trece años después, Alice Delastelle decide mejorar el cifrado de cuatro cuadrados al aumentar el tamaño del alfabeto y el número de claves. [cita requerida]

Configuración clave

El alfabeto contiene los siguientes caracteres (comenzando con el espacio):

 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

Dada una frase de paso, construimos una permutación de este alfabeto de la siguiente manera:

  1. Mantenga solo la primera aparición de cada personaje.

  2. Agregue los caracteres no utilizados del alfabeto, en su orden natural.

Después de convertir cuatro frases de paso en cuatro claves, dividimos cada clave en un cuadrado de longitud lateral 7 y organizamos los cuatro cuadrados resultantes para que formen un cuadrado grande.

Por ejemplo, si las frases de contraseña fueran

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!

las llaves se construirían y organizarían así:

PROGAMI  POULARI
N UZLES  TY CNES
&CDF!"#  &DBWG!"
$%'()*+  #$%'()*
,-./:;<  +,-./:;
=>?@BHJ  <=>?@FH
KQTVWXY  JKMQVXZ

CORET H  DON'T E
SBAYPL!  LV!"#$%
"#$%&'(  &()*+,-
)*+,-./  ./:;<=>
:;<=>?@  ?@ABCFG
DFGIJKM  HIJKMPQ
NQUVWXZ  RSUWXYZ

Cifrado

Dado un mensaje de texto sin formato como

ALICE LOVES BOB.

agregamos 0 o 1 espacios para igualar su longitud y dividirlo en pares de caracteres:

["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]

Para cada par de caracteres, ubicamos el primer carácter en el primer cuadrado (orden de lectura) y el segundo en el cuarto.

Luego, elegimos los caracteres en los cuadrados restantes de modo que los cuatro caracteres seleccionados formen un rectángulo cuyos lados son paralelos a los lados de los cuadrados.

Finalmente, reemplazamos el par de caracteres por los caracteres seleccionados del segundo y tercer cuadrado.

Para nuestra cadena de ejemplo, esto produce

["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]

dando como resultado el siguiente texto cifrado:

PPA@E YTZEEH=T<-

Tarea

Escriba un programa o función que acepte cuatro frases de paso y un texto sin formato, utilice la variante anterior del cifrado de cuatro cuadrados para cifrarlo y devuelva el texto cifrado resultante.

Detalles:

  • Las cinco cadenas de entrada consistirán únicamente en caracteres del alfabeto mencionado.

  • Las cinco cadenas de entrada se pueden leer en cualquier orden, como tal, una sola cadena delimitada por nuevas líneas o como una matriz de cinco cadenas.

  • Puede suponer que ninguna de las cadenas está vacía.

  • La salida debe ser una sola cadena.

    Si elige imprimir el resultado en STDOUT, puede imprimir solo los caracteres del texto cifrado y (opcionalmente) una nueva línea final.

  • Aplican reglas estándar de .

Casos de prueba

En todos los casos de prueba, las primeras cuatro cadenas corresponden a los cuadros clave en el orden de lectura y la última cadena de entrada al texto sin formato.

Entrada

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.

Salida

PPA@E YTZEEH=T<-

Entrada

 !"#$%&'()*+,-./:;<=>
 !"#$%&'()*+,-./:;<=>?@ABCDE
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD! 

Salida

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!

Salida

#>TE,VK+,ZQ(&<[email protected]@DM%NAC&>

Entrada

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

Salida

GOOD LUCK, HAVE FUN.
Dennis
fuente

Respuestas:

4

CJam, 52 50 49 47 46 44 bytes

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

El orden de entrada es líneas 5, 2, 3, 1, 4. Pruébalo en línea .

(-1 byte gracias a @ MartinBüttner, -2 bytes gracias a @Dennis)

Explicación

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 los índices, queremos intercambiar los dígitos menos significativos, base 7. Por ejemplo, para el primer ejemplo ALestán los índices 4y las 7teclas 1 y 4 respectivamente. En la base 7, esto es [0 4]y [1 0]. El intercambio de los dígitos menos significativos da [0 0]y [1 4], es decir, 0y 11, y esto corresponde a Py Pen las teclas 2 y 3 respectivamente.

Sin embargo, en lugar de la conversión de base, el código hace lo siguiente:

[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
fuente
6

Pyth, 74 71 bytes

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

Probablemente podría optimizarse mucho. Yo uso mucha cremallera.

Toma entrada en el siguiente orden:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
fuente
¿Puedo robar su idea de pedido de entrada?
Maltysen
@Maltysen Claro.
orlp
4

Pyth - 88 86 83 78 76 75 72 bytes

8 bytes guardados gracias a @orlp .

Mucho tiempo, estoy bastante descontento con esto, pero solo lo publico mientras busco una mejor manera de manejar los cuadrados.

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

Pruébelo en línea aquí .

Maltysen
fuente
Se puede reemplazar c+e.z*%le.z2d2con C.tce.z2d. No pregunte :)
orlp