สร้างตัวเข้ารหัส rot32


10

การสร้างตัวเข้ารหัส rot13 ที่ golfed นั้นง่ายเกินไปเพราะตัวอักษรนั้นมีลำดับเดียวกันทั้งหมดในพื้นที่อักขระ ASCII ลองใช้โปรแกรม rot32 แทน

งานของคุณคือการสร้างฟังก์ชั่นที่ใช้สตริง Base64 เป็นอินพุตและส่งคืนสตริงเดียวกัน แต่ด้วยตัวอักษรแต่ละตัวหมุน 32 สัญลักษณ์จากเดิม (ในสาระสำคัญด้วยการพลิกบิตแรก)

base64 เข้ารหัสสตริงเพื่อการใช้งานสำหรับปัญหานี้ด้วยตัวอักษรช่องว่างของ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/ =นี้คือการป้องกันการแก้ปัญหาที่อาจจะใช้หรือนำเข้าในตัวห้องสมุด Base64 ที่สตริงปกติเริ่มต้นด้วยแทนA0

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+

โปรแกรมสั้นที่สุดที่จะทำเช่นนั้นในภาษาใดก็ได้จะชนะ


4
จากคำถามนี้ฉันจะเข้าใจว่าเราต้องทำการถอดรหัสเบส -64, การบิดนิด ๆ หน่อย ๆ และการเข้ารหัส 64 บิต แต่คำตอบตัวอย่างของคุณแสดงให้เห็นว่าการพูดคุยทั้งหมดเกี่ยวกับ base-64 เป็นปลาเฮอริ่งแดงและมันก็เหมือนกับ rot-13 ยกเว้นว่าชุดของตัวละครที่ไม่ได้รับการเพิกเฉยนั้นใหญ่กว่า มันคืออะไร
Peter Taylor

1
มันเหมือนกับ rot-13 แต่ฉันคิดว่าการทวิบิตซ้ำ ๆ อาจเป็นกลยุทธ์ที่เป็นไปได้ที่จะทำให้โค้ดสั้นลง
Joe Z.

คำตอบ:


4

CJam, 24 ไบต์

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

ลองออนไลน์

มันทำงานอย่างไร

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


5

Perl, 41

เพียงง่ายๆทับศัพท์ อ่านจาก STDIN, ส่งออกไปยัง STDOUT:

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

ลองที่นี่


2
ใครบอกว่า Perl ไม่ใช่ esolang (และ / หรือภาษาการเล่นกอล์ฟ)
เครื่องมือเพิ่มประสิทธิภาพ

คุณสามารถโกนไม่กี่ตัวอักษรโดยใช้-pและ-eสวิตช์บรรทัดคำสั่งในการกำจัดของและ$_=<>; ;print
ทำเครื่องหมาย

4

CJam, 45 41 38 29 27 26 ไบต์

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

อ่านสตริงที่จะเข้ารหัสจาก STDIN

มันทำงานอย่างไร :

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

ลองออนไลน์ได้ที่นี่


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

นี่คือการใช้งานอ้างอิงที่ไม่มีผู้มาก่อนใน Python ที่คุณสามารถใช้เพื่อทดสอบการใช้งานของคุณเอง


อย่างน้อยฉันก็หวังว่ามันจะเป็นที่สุดท้าย
Joe Z.

0

GolfScript ( 41 40 ไบต์)

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

การสาธิตออนไลน์

มีสองส่วนนี้: การแปลเป็นตัวแปรในเทคนิคสุดท้ายที่กล่าวถึงในเคล็ดลับของฉันtrใน GolfScriptและส่วนอื่น ๆ คือการสร้างสตริงซึ่งใช้สตริง0:a{A[เป็นอาร์เรย์ของค่าถ่านและพับเพื่อเปลี่ยนเป็น ช่วงตัวละคร สังเกตการใช้32/(*เพื่อสร้างสตริงที่แปลโดยการใส่ 32 ตัวอักษรแรกระหว่าง 32 ตัวที่สองและตัวละครที่เรากำลังแปล


0

หลาม, 69

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

การทดสอบ

>>> 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=

0

LiveScript, 91

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

LiveScript, 50

หากอนุญาตให้ใช้สตริงเป็นอาร์กิวเมนต์ที่สอง

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

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}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.