Bir rot32 şifreleyici oluşturun


10

Golfçü bir rot13 şifreleyici oluşturmak çok kolay çünkü harfler ASCII karakter alanında aynı sırada. Bunun yerine bir rot32 motoru deneyelim.

Göreviniz, bir Base64 dizesini girdi olarak alan ve aynı dizeyi döndüren ancak her harf orijinalinden 32 sembol döndürülmüş (özünde, ilk bit çevrilmişken) bir işlev oluşturmaktır.

Bu sorun için kullanılacak base64 kodlama dizesi 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/bir dolgu karakteri ile =. Bu başka türlü yerleşik bir Base64 kütüphanesinde dizeleri normalde ile başlamak nerede kullanın veya ithal ediyorum çözümler önlemektir Ayerine 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+

Herhangi bir dilde yapılacak en kısa program kazanır.


4
Sorudan, bir base-64 kod çözme, bazı bit-twiddling ve bir base-64 kodlama yapmamız gerektiğini anlıyorum. Ancak örnek cevabınız, base-64 hakkındaki tüm konuşmanın kırmızı bir ringa balığı olduğunu ve görmezden gelinmeyen karakter kümesinin daha büyük olması dışında rot-13 gibi olduğunu gösteriyor. Hangisi?
Peter Taylor

1
Tıpkı rot-13 gibi, ama bit-twiddling'in kodu kısaltmak için olası bir strateji olabileceğini düşünüyordum.
Joe Z.

Yanıtlar:


4

CJam, 24 bayt

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

Çevrimiçi deneyin.

Nasıl çalışır

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

15

Bash / Unix kabuğu, 29

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

STDIN girişi, STDOUT çıkışı.


5

Perl, 41

Sadece basit bir harf çevirisi . STDIN'den okumalar, STDOUT'a çıktılar:

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

Burada deneyin.


2
Perl'in bir esolang (ve / veya golf amaçlı dil) olmadığını kim söyledi?
Doktor

Sen kullanarak birkaç karakter tıraş olabilir -pve -ekomut satırı kurtulmak geçer $_=<>;ve ;print.
Mark

4

CJam, 45 41 38 29 27 26 bayt

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

STDIN'den şifrelenecek dizeyi okur

Nasıl çalışır :

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

Buradan çevrimiçi deneyin


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

Bu, Python'da kendi uygulamanızı test etmek için kullanabileceğiniz ungolfed, son yer referans uygulamasıdır.


En azından umarım son sırada kalır.
Joe Z.

0

GolfScript ( 41 40 bayt)

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

Çevrimiçi demo

Çeviri belirtilen son teknik üzerinde bir çeşididir: İki parça Buna vardır benim ucu trGolfScript içinde ve diğer kısmı dizesini kullanır dize binadır 0:a{A[Char değerler dizisi ve bunları açmak için bir kat olarak karakter aralıkları. 32/(*İkinci 32 karakter ile çevirdiğimiz karakter arasına ilk 32 karakteri ekleyerek çevrilmiş dizeyi oluşturmak için kullanıldığına dikkat edin.


0

piton, 69

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

testler

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

Dizeye ikinci bir bağımsız değişken olarak izin verilirse.

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}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.