Escriba dos programas:
- Uno que lea una cadena y una clave y codifique la cadena en un cifrado de riel utilizando esa clave. - Del mismo modo, escriba un programa para la función inversa: descifrar una cerca de riel con una tecla.
Para aquellos que no saben qué es el cifrado de valla de riel, es básicamente un método de escribir texto plano de una manera que crea un patrón lineal en forma de espiral. Ejemplo: cuando "FOOBARBAZQUX" cercado con riel con la tecla 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Al leer la espiral de arriba línea por línea, el texto cifrado se convierte en "FAZOBRAQXOBU".
Lea más en - Cifrado de cerca de riel - Wikipedia .
El código en cualquier idioma es bienvenido.
La respuesta más corta en bytes gana.
code-golf
cryptography
cipher
ShuklaSannidhya
fuente
fuente
Respuestas:
Python 133 bytes
Uso de la muestra:
Nota: los resultados de recuentos pares de rieles son diferentes a los del código que proporcionó, pero parecen ser correctos. Por ejemplo, 6 rieles:
corresponde a
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, y noAKUTBLVJICMSWXRDNHQYEOGZFP
como produce su código.La idea básica es que cada riel se puede encontrar directamente tomando segmentos de cadena
[i::m]
, dondei
está el número de riel (0
-indexado) ym
es(num_rails - 1)*2
. Además, los rieles internos deben entrelazarse[m-i::m]
, lo que se logra al comprimir y unir los dos conjuntos de caracteres. Debido a que el segundo de estos puede ser potencialmente un carácter más corto,se rellena con un carácter que se supone que no aparece en ningún lado (, se convierte en una lista y se rellena con una cadena vacía._
), y luego ese carácter se elimina si es necesarioUna forma ligeramente más legible para los humanos:
fuente
APL
5241Si la cadena de texto de entrada i y el número de clave n están preinicializados, la solución puede acortarse en 9 caracteres. Ejecutar la solución contra los ejemplos dados por primo da respuestas idénticas:
En una reflexión posterior, parece haber una solución basada en índices más corta:
fuente
Python 2 , 124 + 179 = 303 bytes
Codificar:
Pruébalo en línea!
Descodificar:
Pruébalo en línea!
fuente
MATL, 70 bytes (total)
Pruébelo en MATL en línea
Pruebe múltiples casos de prueba
Toma una bandera como tercera entrada,
F
para cifrar la cadena,T
para descifrarla (gracias a Kevin Cruijssen por esa idea).Esto comenzó como una respuesta de Julia hasta que me di cuenta de que la mecanografía estricta se interponía demasiado, especialmente para descifrarla. Aquí está el código de Julia que tenía para el cifrado (respaldado a v0.6 para TIO):
Julia 0.6 , 191 bytes
Pruébalo en línea!
Explicación:
La operación de valla ferroviaria
puede verse como lectura de r = 3 caracteres de entrada, luego lectura de caracteres r-2 y prefijos y sufijos con valores ficticios (nulos), luego lectura de caracteres r nuevamente, etc., creando una nueva columna cada vez:
a continuación, invirtiendo cada segunda columna (desde la zag parte de zigzag sube en lugar de hacia abajo, lo que hace una diferencia cuando r> 3), entonces la lectura de esta matriz a lo largo de las filas, y la eliminación de los personajes ficticios.
El desciframiento no parecía tener ningún patrón obvio como este, pero cuando busqué sobre esto me encontré con esta publicación , que me decía que (a) este era un algoritmo bien conocido y (¿posiblemente?) Publicado para cifrado de riel, y ( b) el descifrado fue una simple reutilización del mismo método, dándole los índices de la cadena y obteniendo los índices de esos índices después del cifrado, y leyendo el texto cifrado en esos lugares.
Dado que el descifrado necesita hacer cosas al trabajar en índices, este código también cifra al clasificar los índices de la cadena y, en este caso, simplemente indexa esos índices reorganizados.
fuente
Quiero ser explicado en este código.
fuente
Java 10,
459451445439327 bytes-12 bytes gracias a @ceilingcat .
-112 bytes que combinan las dos funciones con un indicador de modo adicional como entrada.
La función toma una tercera entrada
M
. Si estrue
así, lo cifrará, y si lo esfalse
, lo descifrará.Pruébalo en línea.
Explicación:
fuente