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 Jla 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 Jcon un I, elimine todos los caracteres que no sean del alfabeto y divídalos en pares, usando un Xpara separar cualquier par que contenga la misma letra dos veces. Si termina con un número impar de letras, agregue Xal 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
stdinargumentos 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
XXocurra 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,
MASSACHUSETTSdebe cifrarse comoMA SX SA CH US ET TS: el dobleSdebe dividirse, pero el dobleTno.
fuente

J" ¿Albergan sentimientos similares sobre APL?Respuestas:
JI *,536431417380263218203197186167(con amplias sugerencias de @algorithmshark)
ejemplo de uso:
divide la entrada correctamente:
* reemplazar cada
Jcon 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
charsen 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 enchoplugar dechomp).&también elimina la necesidad deuniqmás tarde. Y locharsde matriz también se aplica a la línea 6.tra&la línea 1 no funciona porquemno se puedeuniqified. Sin embargo,k.uniqse 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
stdinpara 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
zalambda 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 lafilterllamada 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 deEque 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