Напишите программу или функцию (или набор программ / функций) для шифрования и дешифрования данных с учетом следующей спецификации:
шифрование
Вычислить XOR-хэш-данные ввода, XOR-каждый байт друг с другом.
XOR каждый байт ввода этого хэша.
Сдвиньте результат на четыре бита влево.
Дополните левую сторону первыми четырьмя битами хэша XOR.
Дополните правую сторону последними четырьмя битами хэша XOR.
пример
Учитывая вход:
"G0lf"
(0x47306C66
)Рассчитать XOR хеш:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR каждый байт по хешу:
0x3A4D111B
Ожидаемый результат (после смены и заполнения):
"s¤Ñ\x11½"
(0x73A4D111BD
)
правила
Ваша программа / функция может выполнять ввод / вывод любого типа, который имеет смысл на выбранном вами языке игры в гольф (String, Byte Array и т. Д.), Если входные / выходные данные являются действительными байтами. Например, вы не можете выводить шестнадцатеричную строку.
Шифрование и дешифрование могут быть разделены на отдельные программы (оценка будет соответствовать их объединенному размеру) или одну. Одиночные методы могут принимать аргумент о том, должен ли он шифроваться или расшифровываться.
Ожидается, что ввод для шифрования будет иметь размер не менее 1 байта.
Ожидается, что вход для дешифрования будет не менее 2 байтов.
Непечатные байты не должны быть экранированы в выводе.
источник
Ответы:
CJam, 28 + 27 = 55 байт
Для каждой части я представляю одну программу, которая ожидает ввод / вывод в виде целочисленного массива, и одну, которая использует строку. Приведенный выше счетчик байтов предназначен для версии целочисленного массива, но связанный скрипт и объяснение предназначены для строковой версии (которую можно использовать для проверки примера, приведенного в вопросе).
шифрование
Дешифрирование
Вот тестовый скрипт, который выполняет полный обход и печатает зашифрованный код перед повторной расшифровкой.
объяснение
источник
CJam, 36 + 34 = 70 байт
Немного другой подход с использованием бинарных форм
Шифратор :
Как это устроено:
Дешифровщик :
Как это устроено:
Попробуйте шифратор и дешифратор онлайн
источник
Pyth, 69 байт
Это объединяет шифрование и дешифрование, просто добавьте
0
аргумент as для шифрования или a1
для расшифровки. Причина этого проста. Преобразование строк в биты (или 4-х битное целое число) или наоборот очень долго в Pyth. Объединяя обе функции в одну программу, я могу сэкономить много байтов.Онлайн демонстрации: шифрование и дешифрование .
Объяснение:
Первая часть преобразует входные данные в список 4-разрядного целого числа (каждый символ преобразуется в 2 4-разрядное целое число) и сохраняет его в
K
.Вторая часть определяет значения хешей и сохраняет их в
J
. ЕслиQ==0
он вычисляет их по xor, в противном случае он принимает первое и последнее значениеK
.Следующая часть выполняет xor, используя значения хеша. Когда
Q == 0
это выполняется в полном спискеK
, в противном случае только в спискеK
без первого и последнего значения.И последняя часть преобразует
K
обратно в символы:источник
Javascript ( ES6 ) 83 + 73 = 156
Обе функции принимают входные данные как и выводят массив чисел для представления байтов.
Шифровать
858483Расшифровывать
7573Демонстрация (только Firefox)
Использование строк 131 + 129 = 260
И просто для удовольствия ... вот некоторые версии, которые вместо этого используют строки для ввода / вывода.
источник