Construa um criptografador rot32

10

Criar um criptografador rot13 com golfe é muito fácil, porque as letras são da mesma ordem no espaço de caracteres ASCII. Vamos tentar um mecanismo rot32.

Sua tarefa é criar uma função que recebe uma string Base64 como entrada e retorna a mesma string, mas com cada letra girada 32 símbolos em relação ao original (em essência, com o primeiro bit invertido).

A cadeia de codificação base64 a ser usada para esse problema está 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/com um caractere de preenchimento de =. Isso evita soluções que, de outra forma, usariam ou importariam uma biblioteca interna Base64 onde as strings normalmente iniciam em Avez 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+

O programa mais curto para fazê-lo em qualquer idioma vence.

Joe Z.
fonte
4
A partir da pergunta, eu entenderia que precisamos fazer uma decodificação da base 64, algumas modificações de bits e uma codificação da base 64. Mas sua resposta de exemplo sugere que toda a conversa sobre a base-64 é um arenque vermelho, e é como a rot-13, exceto que o conjunto de caracteres que não são ignorados é maior. Qual é?
Peter Taylor
11
É como a rot-13, mas eu estava pensando que a manipulação de bits pode ser uma estratégia possível para tornar o código mais curto.
Joe Z.

Respostas:

4

CJam, 24 bytes

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

Experimente online.

Como 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
fonte
15

Shell Bash / Unix, 29

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

Entrada de STDIN, saída em STDOUT.

Maçaneta da porta
fonte
5

Perl, 41

Apenas uma transliteração simples . Lê de STDIN, produz para STDOUT:

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

Experimente aqui.

r3mainer
fonte
2
Quem disse que o Perl não é um esolang (e / ou linguagem orientada para o golfe)?
Optimizer
Você pode cortar alguns caracteres usando as opções da linha de comando -pe -epara se livrar da $_=<>;e da ;print.
Mark
4

CJam, 45 41 38 29 27 26 bytes

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

Lê a string a ser criptografada de STDIN

Como 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";

Experimente online aqui

Optimizer
fonte
3

Python, 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 é uma implementação de referência não-destruída e de último lugar no Python que você pode usar para testar sua própria implementação.

Joe Z.
fonte
Pelo menos, espero que permaneça em último lugar.
Joe Z.
0

GolfScript ( 41 40 bytes)

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

Demonstração online

Existem duas partes: a tradução é uma variante da última técnica mencionada na minha dica trno GolfScript , e a outra parte é a construção de strings, que usa a string 0:a{A[como uma matriz de valores de caracteres e uma dobra para transformá-las em intervalos de caracteres. Observe o uso de 32/(*para criar a string traduzida inserindo os primeiros 32 caracteres entre os segundos 32 caracteres e o caractere que estamos traduzindo.

Peter Taylor
fonte
0

python, 69

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

testes

>>> 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
fonte
0

LiveScript, 91

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

LiveScript, 50

Se a sequência for permitida como um segundo argumento.

f=(a,b)->a.replace /[^\W_]/ ->r[32.^.b.indexOf it]
Isiah Meadows
fonte
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}
martelo de lobo
fonte