Construye un encriptador rot32

10

Construir un cifrador rot13 golfizado es demasiado fácil porque las letras son todas del mismo orden en el espacio de caracteres ASCII. Probemos un motor rot32 en su lugar.

Su tarea es construir una función que tome una cadena Base64 como entrada y devuelva la misma cadena pero con cada letra girada 32 símbolos de su original (en esencia, con el primer bit invertido).

La cadena de codificación base64 que se utilizará para este problema es 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/con un carácter de relleno de =. Esto es para evitar soluciones que de otro modo usarían o importarían una biblioteca Base64 incorporada donde las cadenas normalmente comienzan en Alugar de 0.

Example inputs and outputs:

> rot32("THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=")
nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=

> rot32("NB8UKOC6EU5LIQHU9IRUDOGJMUIP8LUNB8UF4TSU7IA=")
h5Eoei6C8oBfckboFclo7iadgocjEfoh5Eo9AnmoDc4=

> rot32("Daisy++daisy++give+me+your+answer+true/I+/+m+half+crazy++all+for+the+love+of+you")
7GOY2uuJGOY2uuMO/KuSKu2U+XuGTY0KXuZX+KvcuvuSuNGRLuIXG32uuGRRuLUXuZNKuRU/KuULu2U+

El programa más corto para hacerlo en cualquier idioma gana.

Joe Z.
fuente
44
A partir de la pregunta, entendería que tenemos que hacer una decodificación de base 64, algunos ajustes de bits y una codificación de base 64. Pero su respuesta de muestra sugiere que todo lo que se habla sobre la base-64 es un arenque rojo, y es como la podredumbre 13, excepto que el conjunto de caracteres que no se ignoran es mayor. Cual es
Peter Taylor
1
Es como la podredumbre 13, pero estaba pensando que los pequeños cambios podrían ser una posible estrategia para acortar el código.
Joe Z.

Respuestas:

4

CJam, 24 bytes

q"+"":/{a[A"{,^}/_32m>er

Pruébalo en línea.

Cómo funciona

q         " Read from STDIN.                                                              ";
"+"       " Push that string.                                                             ";
":/{a[A"  " Push that string.                                                             ";
{         " For each character in the second string:                                      ";
  ,       "   Push the string of all charcters with a lower ASCII code.                   ";
  ^       "   Take the symmetric difference of the two topmost strings on the stack.      ";
}/        " Result: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789'.   ";
_32m>     " Rotate a copy 32 characters to the right.                                     ";
er        " Perform character transliteration.                                            ";
Dennis
fuente
15

Bash / Unix shell, 29

tr 0-9a-zA-Z+/ w-zA-Z+/0-9a-v

Entrada de STDIN, salida en STDOUT.

Pomo de la puerta
fuente
5

Perl, 41

Solo una simple transliteración . Lecturas de STDIN, salidas a STDOUT:

$_=<>;y#0-9a-zA-Z+/#w-zA-Z+/0-9a-v#;print

Pruébalo aquí.

r3mainer
fuente
2
¿Quién dice que Perl no es un esolang (y / o un lenguaje orientado al golf)?
Optimizador
Puede eliminar algunos caracteres utilizando los modificadores de línea de comando -py -epara eliminar el $_=<>;y el ;print.
Mark
4

CJam, 45 41 38 29 27 26 bytes

qA,'{,97>_eu"+/"+++_32m>er

Lee la cadena a cifrar desde STDIN

Cómo funciona :

q                              "Read input";
 A,                            "Get 0 - 9 array";
   '{,                         "Get array/string of ASCII code 0 till ASCII code of z";
      97>                      "Remove first 96 characters to get a-z string";
         _eu                   "Copy a-z array and turn it to uppercase A-Z array";
            "+/"+++            "Push string +/ and concat all 4 arrays";
                   _32m>       "Copy the array and move first 32 characters to end";
                        er     "Transliterate input using the two arrays, leaving ="
                               "intact as it does not appear in the first array";

Pruébalo en línea aquí

Optimizador
fuente
3

Pitón, 178

b = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"

def rot32(s):
    o = ""
    for c in s:
        if c not in b:
            o += c
        else:
            o += b[b.find(c) ^ 32] 
    return o

Esta es una implementación de referencia de último lugar en Python que puedes usar para probar tu propia implementación.

Joe Z.
fuente
Al menos, espero que se quede en el último lugar.
Joe Z.
0

GolfScript ( 41 40 bytes)

{'0:a{A['2/{{,>}*}%'+/'+[1$]+.32/(*@?=}%

Demostración en línea

Hay dos partes en esto: la traducción es una variante de la última técnica mencionada en mi consejo sobre trGolfScript , y la otra parte es la construcción de cadenas, que utiliza la cadena 0:a{A[como una matriz de valores de caracteres y un pliegue para convertirlos en rangos de caracteres. Tenga en cuenta el uso de 32/(*para construir la cadena traducida insertando los primeros 32 caracteres entre los segundos 32 caracteres y el carácter que estamos traduciendo.

Peter Taylor
fuente
0

pitón, 69

f = lambda s,b: ''.join(b[b.index(c)^32] if c in b else c for c in s)

pruebas

>>> b = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
>>> print f("THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=", b)
nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=

>>> print f('nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=', b)
THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=
Brian
fuente
0

LiveScript, 91

r=[\0 to\9].concat [\a to\z] [\A to\Z] [\+ \/];f=(.replace /[^\W_]/ ->r[32.^.r.indexOf it])

LiveScript, 50

Si la cadena está permitida como un segundo argumento.

f=(a,b)->a.replace /[^\W_]/ ->r[32.^.b.indexOf it]
Isiah Meadows
fuente
0

JavaScript 164

b="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
function rot32(s){for(i=0,o="";i<s.length;i++)c=s[i],j=b.indexOf(c),o+=j>-1?b[j^32]:c
return o}
martillo de lobo
fuente