Bangun enkripsi rot32

10

Membangun enkripsi rot13 golfed terlalu mudah karena huruf-hurufnya semuanya berurutan sama dalam ruang karakter ASCII. Mari kita coba mesin rot32 sebagai gantinya.

Tugas Anda adalah membangun fungsi yang mengambil string Base64 sebagai input dan mengembalikan string yang sama tetapi dengan setiap huruf diputar 32 simbol dari aslinya (pada intinya, dengan bit pertama dibalik).

String pengkodean base64 yang digunakan untuk masalah ini adalah 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/dengan karakter padding dari =. Ini untuk mencegah solusi yang seharusnya menggunakan atau mengimpor pustaka Base64 bawaan tempat string biasanya dimulai dengan Aalih - alih 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+

Program terpendek untuk melakukannya dalam bahasa apa pun menang.

Joe Z.
sumber
4
Dari pertanyaan itu, saya akan mengerti bahwa kita harus melakukan decode basis-64, beberapa bit-twiddling, dan basis-64 encode. Tetapi jawaban sampel Anda menunjukkan bahwa semua pembicaraan tentang base-64 adalah herring merah, dan itu seperti busuk-13 kecuali bahwa rangkaian karakter yang tidak diabaikan lebih besar. Yang mana itu?
Peter Taylor
1
Ini seperti busuk-13, tetapi saya berpikir bit-twiddling mungkin merupakan strategi yang memungkinkan untuk membuat kode lebih pendek.
Joe Z.

Jawaban:

4

CJam, 24 byte

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

Cobalah online.

Bagaimana itu bekerja

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

Bash / Unix shell, 29

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

Input dari STDIN, output pada STDOUT.

Gagang pintu
sumber
5

Perl, 41

Hanya transliterasi sederhana . Dibaca dari STDIN, output ke STDOUT:

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

Cobalah di sini.

r3mainer
sumber
2
Siapa bilang Perl bukan bahasa esolang (dan / atau golf)?
Pengoptimal
Anda dapat memangkas beberapa karakter dengan menggunakan sakelar baris perintah -pdan -euntuk menyingkirkan $_=<>;dan ;print.
Markus
4

CJam, 45 41 38 29 27 26 byte

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

Membaca string yang akan dienkripsi dari STDIN

Cara kerjanya :

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

Cobalah online di sini

Pengoptimal
sumber
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

Ini adalah implementasi referensi tempat-terakhir ungolfed, di Python yang dapat Anda gunakan untuk menguji implementasi Anda sendiri.

Joe Z.
sumber
Setidaknya, saya harap ini tetap di tempat terakhir.
Joe Z.
0

GolfScript ( 41 40 bytes)

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

Demo online

Ada dua bagian untuk ini: terjemahannya adalah varian pada teknik terakhir yang disebutkan dalam tip saya trdi GolfScript , dan bagian lainnya adalah pembuatan string, yang menggunakan string 0:a{A[sebagai array nilai char dan lipatan untuk mengubahnya menjadi rentang karakter. Perhatikan penggunaan 32/(*untuk membangun string yang diterjemahkan dengan memasukkan 32 karakter pertama antara 32 karakter kedua dan karakter yang kami terjemahkan.

Peter Taylor
sumber
0

python, 69

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

tes

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

LiveScript, 91

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

LiveScript, 50

Jika string diizinkan sebagai argumen kedua.

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