Создайте шифр Rot32

10

Создать зашифрованный rot13 шифратор слишком просто, потому что буквы находятся в одном и том же порядке в символьном пространстве ASCII. Давайте попробуем двигатель rot32 вместо этого.

Ваша задача состоит в том, чтобы создать функцию, которая принимает строку Base64 в качестве входных данных и возвращает ту же строку, но с каждой буквой, повернутой на 32 символа от ее оригинала (по сути, с перевернутым первым битом).

Строка кодирования base64, используемая для этой проблемы, 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/содержит символ дополнения =. Это делается для предотвращения решений, которые в противном случае использовали бы или импортировали встроенную библиотеку Base64, где строки обычно начинаются с, Aа не с 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+

Самая короткая программа на любом языке выигрывает.

Джо З.
источник
4
Из этого вопроса я бы понял, что мы должны выполнить декодирование base-64, немного бит-переворот и кодирование base-64. Но ваш примерный ответ предполагает, что все разговоры о base-64 - это красная сельдь, и она похожа на rot-13, за исключением того, что набор символов, которые не игнорируются, больше. Что он?
Питер Тейлор
1
Это похоже на Rot-13, но я подумал, что бит-твиддлинг может стать возможной стратегией для сокращения кода.
Джо З.

Ответы:

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.                                            ";
Деннис
источник
15

Bash / Unix shell, 29

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

Вход от STDIN, выход от STDOUT.

Дверная ручка
источник
5

Perl, 41

Просто простая транслитерация . Читает из STDIN, выводит в STDOUT:

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

Попробуйте это здесь.

r3mainer
источник
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

Питон, 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, которую вы можете использовать для тестирования своей собственной реализации.

Джо З.
источник
По крайней мере, я надеюсь, что это останется последним.
Джо З.
0

GolfScript ( 41 40 байт)

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

Онлайн демо

Здесь есть две части: перевод - это вариант последнего метода, упомянутого в моем совете по trGolfScript , а другая часть - построение строк, которое использует строку 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}
wolfhammer
источник