Ваша задача - взять зашифрованную строку в качестве ввода и вывести расшифрованную строку, чтобы показать ее скрытое сообщение.
Строки, как входные, так и выходные, будут содержать символы из этого списка из 64 символов ASCII (обратите внимание на начальный пробел):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Этим символам присваиваются номера в порядке их перечисления выше:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Итак, пробел - это число 0, !
это номер 1 и ~
номер 63. Эти числа могут быть представлены в 6-битном двоичном коде:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
Шифрование очень простое:
Я буду использовать как eC
для зашифрованных символов, так и C
для символов исходной строки. C(n)
является n-ным символом исходной строки, а eC(n)
n-ным символом зашифрованной строки.
Вы будете использовать 6-битное двоичное представление символов. Первый персонаж будет eC(0) = not(C(0))
. Оттуда все персонажи будут eC(n) = xor(C(n),C(n-1))
.
Пример:
Давайте предположим , что входная строка code
.
c
38-й символ (с нулевым индексом) или100110
в двоичном виде. В зашифрованной версии все биты перевернуты, поэтому011001 -> 25 -> '9'
(опять же, нулю проиндексированы).o
это 50-й символ, или110010
в двоичном.xor(100110, 110010) = 010100 = 20 = '4'
,d
является 39-м символом, или100111
в двоичном.xor(100111, 110010) = 010101 = 21 = '5'
,e
это 40-й символ, или101000
в двоичном.xor(101000, 100111) = 001111 = 15 = '/'
,
Таким образом, если исходная строка code
, зашифрованная строка станет 945/
.
Тестовые случаи:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
источник
Ответы:
Желе ,
2726 байтПопробуйте онлайн!
Альтернативная версия, 22 байта (не конкурирует)
Желе, наконец, догнал другие гольф-ланги и получил печатный атом ASCII , так что теперь это работает.
Попробуйте онлайн!
Как это устроено
источник
JavaScript (ES6), 115 байт
Контрольные примеры
Показать фрагмент кода
источник
^
идет направо от]
. Ответ все еще работает с этим изменением для тестовых случаев, которые я считаю.d
из того, что не хватает?Желе ,
3431 байт-3 байта благодаря Деннису (используйте
ḟ
дважды вместоœ-
;;
и¤
используйте”~
вместо 63 )Монадическая ссылка, берущая и возвращающая списки символов.
* Примечание: входные аргументы программы Jelly использовать строку Python форматирования, поэтому цитирую с
"
,'
,'''
(или если однозначная не цитирую) все варианты.Попробуйте онлайн!
Как?
Побитовый xor является обратимым (с учетом «ведущих нулей»).
Побитовый-Not - это xor со «всеми единицами» - в этом случае требуется только 6 единиц, поэтому 2 7 -1 = 63 .
После того, как мы создали массив или символы и просмотрели индексы входных символов, сам декодирование затем является просто кумулятивным уменьшением на бит-xor, после чего мы можем индексировать обратно в тот же массив.
* Примечание: поиск пробела в p даст 64, но это нормально, так как индексирование обратно в p является модульным, поэтому добавление ведущего
1
аналогично добавлению 64, возвращая индекс обратно туда, где он должен быть).источник
Java, 225 байт
Я давно не играл в гольф на Яве, поэтому любые советы по игре в гольф приветствуются.
Попробуйте онлайн!
источник
String D(String E){
становитсяE->{
(-15 байт);-1-J
может быть+~J
(-1 байт); иi=-1
может бытьi=0
,++
может быть перемещен вi++<1?
, а затемi-1
становитсяi-2
(-1 байт). Попробуйте онлайн: 208 байтов05AB1E , 40 байт
Попробуйте онлайн!
объяснение
источник
Набор инструкций CPU x86, 235 байт
Функция find () и deCript () + строка abc: 171 байт + 64 байт = 235 сборка с nasmw и компилятор / библиотека с компилятором Borland C:
Результаты:
Сборка лучше (скажем, правда, я использую систему макросов, да, я знаю, что она слишком длинная, но, как C + + - с системой макросов, скажем, правда, потому что инструкции проще, легко писать код в ассемблере, даже без вносить исправления как один пиши на английском (не я))
источник
C (gcc) , 153 байта
Попробуйте онлайн!
Слегка поиграл меньше
источник
APL (Dyalog Unicode) , 52 байта SBCS
требует
⎕IO←0
Попробуйте онлайн!
источник
¨
{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, вы можете сохранить два байта путем преобразования в полную программу:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Röda ,
120100 байтПопробуйте онлайн!
Я использовал
l=63
трюк из ответа JavaScript.Сейчас я работаю над укорочением,A
поэтому играю в гольф ...источник
Python 2 , 155 байт
Попробуйте онлайн!
источник
PHP, 103 байта
Попробуйте онлайн!
PHP, 107 байт
Попробуйте онлайн!
PHP, 118 байт
Попробуйте онлайн!
источник
Python + Numpy, 214 байтов
Не может конкурировать с другими решениями Python, хотя использует другой, чисто числовой подход:
Немного объяснения:
S=A(r(32,60)+...)
- определить алфавит как диапазон кодовT=A(r(128))
- хэш-таблица инициализации размером 128 (наибольшая кодовая точка)T[S]=A(r(64))
- заполнить хеш-таблицу, т.е. записать индексы 0-63 в элементы с индексами ASCIIW=T[fromstring(s,"b")]
- преобразовать ввод в массив и перевести его в новые кодыW[0]=~W[0]
- инвертировать 1-е значениеW=S[bitwise_xor.accumulate(W)&63]
- использовать метод накопления Numpy с xor, чтобы избежать зацикливания, сбросить 2 левых бита и перевести обратно в asciiисточник
Алиса , 46 байт
Попробуйте онлайн!
объяснение
Первая половина программы работает в порядковом режиме и устанавливает отображение из цифр в символы. Вторая половина работает в кардинальном режиме и использует это отображение для декодирования ввода.
источник
Japt
-P
, 33 байтаПопробуйте онлайн!
По какой-то причине тестовые случаи возражают против запуска как комплекта, так что вот второй , третий и четвертый по отдельности.
Объяснение:
источник
APL (NARS), 72 символа, 144 байта
Предполагается, что входные данные всегда находятся в массиве 's'. Чтобы понять, как сделать расшифровку, мне сначала нужно было написать версию сборки ... test:
источник
105103 байта, машинный код (16 бит x86), 57 инструкцийЗапуск: сохранить на codegolf.com, dosbox:
codegolf.com < input.bin
Почти забыл забавную часть:
Привет, это моя вторая запись. Предыдущий был RC4 . Сделано с использованием HT hexeditor , без компилятора , но на этот раз я использовал Ctrl-a
assemble instruction
, я все еще не знаю, считается ли это записью или нет.Почему как
Аналогичным образом я начал с создания файла с помощью
NOP
s, затем снова использовал чтение / запись из RC4. . Сначала я написал на python «лестницу перевода» из ascii в указатель. и использовал это в сборке, создал аналогичную лестницу в обратном направлении, наконец, я добавил небольшой трюк для обработки первого байтаПо аналогии с RC4 последним шагом было избавление от дополнительных
nops
, которые требовали исправления прыжков.рассечение
Снова программа опирается на начальные значения регистра .
Пустышка, понадобится позже
читать байт
выйти, если стандартный ввод закончен
лестница, которая переводит ascii в index (учтите, что все переходы идут в 0x134)
xor байт за предыдущий байт,
SI
указывает на адрес0x100
, который изначально содержит 0xFF из кода операции фиктивной инструкции в верхней части, что приводит к отрицательному поведению (напоминание: COM загружаются в 0x100)ограничить результат индексом и сохранить байт в 0x100,
лестница в обратном направлении
поместите байт в [di], запишите байт в stdout (учтите, что AH = 40h использует DX в качестве адреса, но он был установлен сверху при чтении байта)
имейте в виду, что stdin -> stdout и stdout для stdin выполняется с использованием inc bx / dec bx
цикл ^^
Инструменты и ресурсы
источник