El Caesar Cypher es un cifrado de sustitución muy simple donde cada letra se desplaza por un desplazamiento fijo (girando alrededor de Z a A). Del mismo modo, también podemos utilizar un cifrador César para el conjunto de caracteres ASCII imprimibles. Estos son los 95 caracteres de los puntos de código 0x20 a 0x7E. Para un desplazamiento dado d
, asignamos el punto de código C
a
(C - 32 + d) % 95 + 32
que desplaza a todos los caracteres por a d
y gira alrededor del ~
espacio. Los caracteres fuera de este rango (caracteres de control como líneas nuevas, pestañas y caracteres fuera del rango ASCII) no se ven afectados.
Debe escribir dos programas o funciones (potencialmente en diferentes idiomas), que toman un desplazamiento d
y una cadena. El primer programa debe devolver o imprimir el cifrado César de la entrada. El segundo programa debe devolver o imprimir el cifrado César inverso (es decir, usar desplazamiento -d
). Puede recibir información a través de STDIN, argumento de línea de comando o argumento de función.
Para hacer las cosas más interesantes, el segundo programa debe ser un cifrado César del primer programa. Es decir, si se pasa el código fuente del primer programa a sí mismo, para algún desplazamiento distinto de cero d
, la salida debe ser el segundo programa.
Ambos programas, así como las cadenas de entrada, deben contener solo caracteres ASCII imprimibles, líneas nuevas y pestañas. Ninguno de los programas puede contener comentarios o leer su propio código fuente, nombre de archivo o ID de proceso directa o indirectamente.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes). Como ambos programas deben tener el mismo tamaño, solo necesita contarlo una vez.
fuente
Pitón 2, 147
Claramente, no pensé demasiado en este, ya que sería inútil en Python. Simplemente hay dos programas separados, con el no utilizado encerrado en una cadena.
El desplazamiento entre los dos programas es 39.
Adelante
Define la función Z aceptando una cadena Unicode y un desplazamiento.
Inverso
Define la función I aceptando una cadena Unicode y un desplazamiento.
fuente
Python 3: 248 bytes
Mi objetivo era hacer esto como Python one-liner. Objetivo de éxito, pero ahora no me puedo molestar en jugar golf.
Cifrar:
Descifrar:
Editar: corregido para no afectar los caracteres fuera del rango ASCII imprimible
El desplazamiento de encriptar a desencriptar es 20. Use ingresando primero el desplazamiento, luego la cadena, por ej.
Explicación
Las siguientes transformaciones son la clave:
El primero permite el uso de
or
, mientras que el segundo ignora una cadena por punto y coma.Tenga en cuenta que
"".__doc__[2]
devuelve la cadenar
(tomada destr
). Esto es necesario para evitar que la cadena entre comillas simples en el programa de descifrado tenga comillas parásitas en el medio.fuente
Rubí,
131125bytesAquí está mi propia presentación (que había escrito anteriormente como prueba de concepto, pero logré violar mis propias reglas de alguna manera). No estoy reutilizando ningún código entre las dos presentaciones (quiero que ustedes superen esto, después de todo), sino que consiste en dos líneas, una de las cuales se convierte en una cadena con galimatías.
Cifrado delantero:
Cifrado inverso:
Ambos fragmentos definen una función (llamada
Y
en la primera yJ
en la segunda), que toma un número entero y una cadena e imprime la cadena transformada en STDOUT. El desplazamiento entre las dos piezas de código es40
.fuente
oOo CODE ,
750744 bytes, todo el código utilizado en ambos programasDemasiado tiempo, pero probablemente sea la herramienta adecuada para hacerlo ...
Cifrar:
Descifrar:
Traducciones de Brainfuck:
oOo CODE es una variante de Brainfuck donde solo importa el caso de las letras.
Toma el primer byte y usa su código de carácter como
d
(por lo que una nueva línea significa d = 10). El resto de la entrada es la cadena. EOF es 0.fuente
GolfScript,
9564 bytes, todo el código utilizado en ambos programasCifrar:
Descifrar:
Formato de entrada:
Explicación
Descifrar:
Cifrar:
fuente
Javascript (borrador ES7) -
167165 bytesTomando prestado del uso de cadenas de @feersum y del uso de punto y coma de @MartinButtner;)
Cifrar:
Descifrar:
Offset para usar: 55
fuente
or <empty string> and <function>
lugar de soloor <function>
.> <> (Pez) , 467 bytes
Cifrar:
Descifrar:
Los dos programas están compensados por 3, y toman la entrada de la forma:
El desplazamiento debe ser de 2 dígitos, por lo que se debe ingresar un desplazamiento de 5 como
05
.Esta es una presentación larga, pero casi todos los caracteres sin relleno son utilizados por ambos programas . Hay mucho espacio en blanco que definitivamente se puede jugar, pero pensé que el programa sería más interesante de esta manera.
Esta imagen resalta los caracteres utilizados por ambos programas.
Explicación
La construcción principal que hace esto posible es
_{} -> b~!
, lo que permite omitir arbitrariamente los caracteres en el programa de descifrado. ¿Cómo?Con todo, el programa de cifrado no hace nada, pero el programa de descifrado omite la siguiente instrucción. Esto puede extenderse a
_{}! -> b~!$
, lo que permite omitir caracteres de forma arbitraria en el programa de cifrado .Aparte de esto, la mayoría del resto del programa está presionando números, realizando operaciones en esos números y luego encontrando formas de hacerlos explotar. Por ejemplo, una construcción útil es
~~ -> ""
, que muestra dos valores para el programa de cifrado, pero no introduce nada en el programa de descifrado.> <>, 149 bytes
Aquí está la versión menos interesante, que utiliza el hecho de que las instrucciones que no se pasan son efectivamente comentarios en lenguajes 2D.
Cifrar:
Descifrar:
Los dos programas están compensados por 84 y toman la entrada de la misma manera que arriba. La primera instrucción decide qué mitad del programa ejecutar, con
i
(entrada) manteniendo el flujo del programa hacia la derecha en el programa de cifrado, y^
redirigiendo el flujo del programa hacia arriba (dando vueltas y regresando desde la parte inferior) en el programa de descifrado.Explicación
Para la mitad relevante del programa de cifrado (el programa de descifrado es similar):
Herramienta de codificación
Esto no está relacionado con el resto de la publicación anterior, pero pensé en publicar esto porque necesito usarlo: P
fuente
Perl - 131
Toma información de los argumentos de la línea de comando.
Cambiarlo por 26 le da al otro:
fuente