Construire un chiffreur rot32

10

Construire un chiffreur rot13 golfé est trop facile car les lettres sont toutes du même ordre dans l'espace de caractères ASCII. Essayons plutôt un moteur rot32.

Votre tâche consiste à créer une fonction qui prend une chaîne Base64 en entrée et renvoie la même chaîne, mais avec chaque lettre pivotée de 32 symboles par rapport à son origine (en substance, avec le premier bit inversé).

La chaîne de codage base64 à utiliser pour ce problème est 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/avec un caractère de remplissage de =. Il s'agit d'empêcher les solutions qui autrement utiliseraient ou importeraient une bibliothèque Base64 intégrée où les chaînes commencent normalement par Aau lieu 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+

Le programme le plus court pour le faire dans n'importe quelle langue gagne.

Joe Z.
la source
4
D'après la question, je comprendrais que nous devons faire un décodage en base 64, un peu de twiddling et un codage en base 64. Mais votre exemple de réponse suggère que tout le discours sur la base-64 est un hareng rouge, et c'est juste comme rot-13, sauf que l'ensemble de caractères qui ne sont pas ignorés est plus grand. Lequel est-ce?
Peter Taylor
1
C'est juste comme rot-13, mais je pensais que le bit-twiddling pourrait être une stratégie possible pour raccourcir le code.
Joe Z.

Réponses:

4

CJam, 24 octets

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

Essayez-le en ligne.

Comment ça fonctionne

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
la source
15

Bash / Unix shell, 29

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

Entrée depuis STDIN, sortie sur STDOUT.

Poignée de porte
la source
5

Perl, 41

Juste une simple translittération . Lit depuis STDIN, sort vers STDOUT:

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

Essayez-le ici.

r3mainer
la source
2
Qui a dit que Perl n'est pas un langage orienté esolang (et / ou golfique)?
Optimizer
Vous pouvez raser quelques caractères en utilisant les commutateurs de ligne de commande -pet -epour vous débarrasser du $_=<>;et du ;print.
Mark
4

CJam, 45 41 38 29 27 26 octets

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

Lit la chaîne à chiffrer depuis STDIN

Comment ça marche :

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

Essayez-le en ligne ici

Optimiseur
la source
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

Il s'agit d'une implémentation de référence de dernière place non golfée en Python que vous pouvez utiliser pour tester votre propre implémentation.

Joe Z.
la source
Au moins, j'espère que cela restera à la dernière place.
Joe Z.
0

GolfScript ( 41 40 octets)

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

Démo en ligne

Il y a deux parties: la traduction est une variante de la dernière technique mentionnée dans mon conseil sur trGolfScript , et l'autre partie est la construction de la chaîne, qui utilise la chaîne 0:a{A[comme un tableau de valeurs char et un pli pour les transformer en plages de caractères. Notez l'utilisation de 32/(*pour construire la chaîne traduite en insérant les 32 premiers caractères entre les 32 seconds caractères et le caractère que nous traduisons.

Peter Taylor
la source
0

python, 69

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

tests

>>> 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
la source
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 chaîne est autorisée comme deuxième argument.

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