Escriba un programa que tome dos líneas de entrada y use la primera como una frase clave para encriptar la segunda de acuerdo con la técnica de encriptación de Playfair.
Wikipedia describe el cifrado de Playfair con cierto detalle , pero para evitar cualquier ambigüedad, aquí hay un breve resumen:
1. Genere una tabla clave:
Reemplace todas las apariciones de J
la frase clave con I
, luego elimine todos los caracteres que no sean del alfabeto y los caracteres repetidos. Inserte en una tabla de cifrado de 5 × 5, llenando las celdas restantes con el resto del alfabeto (excepto J
; no nos gusta J
).
Ejemplo:
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 el mensaje para ser encriptado
Reemplace cada J
con un I
, elimine todos los caracteres que no sean del alfabeto y divídalos en pares, usando un X
para separar cualquier par que contenga la misma letra dos veces. Si termina con un número impar de letras, agregue X
al final. (Nota: los números se deben detallar por completo - ONE
,TWO
,THREE
, etc - pero se puede suponer que esto ya se ha hecho por ti.)
Ejemplo:
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. Cifrado
Cifre cada par de letras a su vez. Si están en diferentes filas y columnas de la tabla de claves, reemplace cada una con la letra de la misma fila en la columna donde se encuentra la otra letra (por ejemplo, VM
⇒ EI
, LZ
⇒ GQ
). Si están en la misma fila (o columna), elija los dos caracteres inmediatamente a la derecha (o debajo), envolviéndolos si es necesario (por ejemplo, OE
⇒ VR
, ZG
⇒KP
).
Ejemplo:
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
La cadena producida por este proceso es el mensaje cifrado, que su programa debería generar.
Reglas:
- El texto de entrada y la clave se pueden obtener de
stdin
argumentos de línea de comandos u otras fuentes similares. La entrada codificada no está permitida. - Su programa debe aceptar texto en mayúsculas y minúsculas para la frase de paso y el mensaje.
- La salida cifrada puede ser mayúscula o minúscula.
- Su programa debe aceptar frases clave de al menos 64 caracteres de longitud y mensajes de texto de al menos 16 KB.
- No es necesario que maneje entradas que no sean ASCII.
- Puede ignorar la posibilidad de que el par de letras
XX
ocurra durante el cifrado. - No es necesario agregar espacios en blanco a la salida del programa.
- Su respuesta debe incluir un ejemplo de mensaje, frase clave y salida cifrada producida por su programa.
- Este es un desafío de código de golf, por lo que la respuesta con el código más corto (en bytes) ganará.
NOTA: Recuerde que solo necesita romper letras consecutivas si aparecen en el mismo par . Entonces, por ejemplo,
MASSACHUSETTS
debe cifrarse comoMA SX SA CH US ET TS
: el dobleS
debe dividirse, pero el dobleT
no.
fuente
J
" ¿Albergan sentimientos similares sobre APL?Respuestas:
JI *,536431417380263218203197186167(con amplias sugerencias de @algorithmshark)
ejemplo de uso:
divide la entrada correctamente:
* reemplazar cada
J
con unI
, ¿verdad?fuente
Ruby,
461411366359352346330 caracteresGracias a @daniero por guardar ... err, muchos bytes. \ o /
Aquí está el código sin golf:
Aquí hay algunos resultados de muestra:
fuente
chars
en una matriz, suponiendo que esté usando Ruby 2. También puede usarlo&
como operador de conjunto en lugar detr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 bytes guardados). Las dos líneas siguientes se pueden unir con algo comok,m=[1,2].map{t[gets.chop]}
(nota enchop
lugar dechomp
).&
también elimina la necesidad deuniq
más tarde. Y lochars
de matriz también se aplica a la línea 6.tr
a&
la línea 1 no funciona porquem
no se puedeuniq
ified. Sin embargo,k.uniq
se puede acortar a(k&k)
(1 byte apagado).C:
495401355341 caracteresEs solo un esbozo a partir de ahora. Debería poder depilar al menos cien caracteres.Objetivo cumplido: más de cien caracteres (154 a partir de ahora) han desaparecido misteriosamente del código.
Con un espacio en blanco agradable:
Escribí la primera iteración del programa a punto de quedarse dormido, por lo que tenía muchas declaraciones sin sentido superfluas y cosas así. La mayor parte de eso se rectifica, pero hay bastantes áreas donde la mejora es definitivamente posible.
fuente
Matlab - 458 caracteres
Algunos ejemplos:
fuente
Haskell - 711
Manifestación:
Código:
Versión grande:
fuente
Pyth - 111
Demasiado tarde para competir, solo quería compartir. Aquí está el codificador y decodificador.
Explicación:
Clave de muestra / Mensaje / Salida:
fuente
C, 516
Se agregaron avances de línea para mejorar la presentación de
legibilidad. (La legibilidad se fue por la ventana, me temo).Ejemplo:
fuente
Pitón 3,
709705685664Acepta entradas de stdin.
Ejemplo:
fuente
Python: 591 bytes
Esto se usa
stdin
para obtener la clave y el mensaje en ese orden. Espero que no sea una trampa usar una lista plana para almacenar la matriz de cifrado, porque eso hizo que trabajar con la matriz fuera bastante simple. Aquí hay algunos ejemplos de ejecución:fuente
z
alambda x:0if b not in x else b.remove(x)or 1
. También hay bastante espacio en blanco del que puede deshacerse. Eso también le permitiría moverlo directamente a lafilter
llamada en lugar de definirlo afuera.Java - 791
Mi primer golf, por lo que cualquier crítica es bienvenida. Usando Java porque no debería. No parece tan malo; menos del doble del tamaño del líder actual. Esperaba que fuera más grande ya que es, bueno, Java :)
Con formato automático:
Salida de muestra:
fuente
JS (nodo) -
528466Salida de muestra:
fuente
UU
. Parece que hubo una repetición deE
que deberías haberte dividido.PHP 582
Sin golf
Decodificador sin
salidas
fuente
Perl, 265
Muy sencillo
Sangrado:
fuente
CoffeeScript - 610
Manifestación:
Código:
Versión sin golf:
fuente