Erstellen Sie einen rot32-Verschlüsseler

10

Das Erstellen eines Golf13 Rot13-Verschlüsselers ist zu einfach, da die Buchstaben im ASCII-Zeichenbereich alle dieselbe Reihenfolge haben. Versuchen wir stattdessen einen rot32-Motor.

Ihre Aufgabe besteht darin, eine Funktion zu erstellen, die eine Base64-Zeichenfolge als Eingabe verwendet und dieselbe Zeichenfolge zurückgibt, wobei jedoch mit jedem Buchstaben 32 Symbole gegenüber dem Original gedreht werden (im Wesentlichen mit dem ersten umgedrehten Bit).

Die Base64 - Kodierung Zeichenfolge verwendet für dieses Problem ist , 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/mit einer Polsterung Charakter =. Dies soll verhindern, dass Lösungen eine integrierte Base64-Bibliothek verwenden oder importieren, bei der Zeichenfolgen normalerweise mit Astatt beginnen 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+

Das kürzeste Programm in einer Sprache gewinnt.

Joe Z.
quelle
4
Aus der Frage würde ich verstehen, dass wir eine Base-64-Decodierung, ein bisschen Bit-Twiddling und eine Base-64-Codierung durchführen müssen. Aber Ihre Beispielantwort legt nahe, dass das ganze Gerede über Base-64 ein roter Hering ist, und es ist genau wie bei Rot-13, nur dass der Satz von Zeichen, die nicht ignoriert werden, größer ist. Welches ist es?
Peter Taylor
1
Es ist wie bei Rot-13, aber ich dachte, Bit-Twiddling könnte eine mögliche Strategie sein, um den Code kürzer zu machen.
Joe Z.

Antworten:

4

CJam, 24 Bytes

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

Probieren Sie es online aus.

Wie es funktioniert

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
quelle
15

Bash / Unix-Shell, 29

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

Eingabe von STDIN, Ausgabe von STDOUT.

Türknauf
quelle
5

Perl, 41

Nur eine einfache Transliteration . Liest von STDIN, gibt an STDOUT aus:

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

Probieren Sie es hier aus.

r3mainer
quelle
2
Wer sagt, dass Perl kein Esolang (und / oder eine golforientierte Sprache) ist?
Optimierer
Sie könnten ein paar Zeichen mit dem abrasieren -pund -eBefehlszeilenoptionen , um loszuwerden, das $_=<>;und das ;print.
Mark
4

CJam, 45 41 38 29 27 26 Bytes

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

Liest die zu verschlüsselnde Zeichenfolge von STDIN

Wie es funktioniert :

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

Probieren Sie es hier online aus

Optimierer
quelle
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

Dies ist eine ungolfed Referenzimplementierung an letzter Stelle in Python, mit der Sie Ihre eigene Implementierung testen können.

Joe Z.
quelle
Zumindest hoffe ich, dass es auf dem letzten Platz bleibt.
Joe Z.
0

GolfScript ( 41 40 Bytes)

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

Online-Demo

Dies besteht aus zwei Teilen: Die Übersetzung ist eine Variante der letzten Technik, die in meinem Tipp trin GolfScript erwähnt wurde , und der andere Teil ist die Zeichenfolgenerstellung, bei der die Zeichenfolge 0:a{A[als Array von Zeichenwerten und als Falte verwendet wird, um sie umzuwandeln Zeichenbereiche. Beachten Sie die Verwendung von 32/(*, um die übersetzte Zeichenfolge zu erstellen, indem Sie die ersten 32 Zeichen zwischen die zweiten 32 Zeichen und das zu übersetzende Zeichen einfügen.

Peter Taylor
quelle
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
quelle
0

LiveScript, 91

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

LiveScript, 50

Wenn die Zeichenfolge als zweites Argument zulässig ist.

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