Криптографический вариант

22

Создайте программу, которая печатает сумму MD5 ее источника в виде:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Нет обмана - вы не можете просто прочитать исходный файл и вычислить его сумму. Программа не должна читать какую-либо внешнюю информацию.

Конечно, вы можете использовать библиотеку MD5, доступную для вашего языка.

Петр Пудлак
источник
1
Если кому-то удастся столкнуться с MD5 (то есть h = f (h), где f - грубая «соль» для h со всем мусором кода, который необходим для печати), я думаю, ему следует разрешить это сделать.
Ник Т
1
@NickT Хотя это было бы чрезвычайно сложно, я мог бы добавить.
PyRulez

Ответы:

13

Python 157 149

r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()

Выход:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Проверка на ideone

Matt
источник
Я получаю другую md5sum для исходного файла.
skevey
@slackwear что ты получаешь?
Мэтт
о, ты отредактировал это снова. Прямо сейчас я 24ba0a79636297dab8803f571d4e3b44 md.pyиспользую md5sum в Linux
skeevey
1
@slackwear если добавить символ новой строки ( \n) в конце моей программы я получаю хэш вас в курсе: 24ba0a79636297dab8803f571d4e3b44. Я вполне уверен, что у вас есть дополнительный перевод строки. (Я думаю, что некоторые редакторы сделают это автоматически)
Мэтт
2
Ты прав. Я не знал, что Вим будет прятать конечные LFs
skeevey
12

Python 2, 91 байт

s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s

Использование варианта Python quine, который не требует повторения всего дважды. Проверено на идеоне .

Sp3000
источник
1
это должен быть принятый ответ
micsthepick
1

Perl + Digest :: MD5, 89 байт

$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval

Нет ссылки на TIO, потому что Digest :: MD5 не установлен на TIO. Обратите внимание, что для этого необходимо, чтобы уровень соответствия языка был установлен на 5,10 или выше ( -M5.010это не влечет за собой байтовых штрафов в соответствии с правилами PPCG.

объяснение

Это еще одна задача «напечатать функцию из исходного кода», означающая, что ее можно решить тривиально с помощью универсального конструктора quine.

Универсальный конструктор Quine

$_=q(…"\$_=q($_);eval");eval

Мы используем q()строковую нотацию (которая встраивается) для инициализации $_, переменную «по умолчанию», которую Perl использует для пропущенных аргументов. Затем мы evalс отсутствующим аргументом, так что строка внутри q()будет оценена.

Строка внутри q()является описанием того, как создать всю программу; мы указываем остальную часть программы буквально, затем используем unescaped, $_чтобы заменить всю строку внутри.

Таким образом, техника создает строку с идентичным содержимым для всего исходного кода программы; мы могли бы напечатать это, чтобы произвести quine. Мы также можем сначала сделать что-то другое, создав универсальный конструктор quine.

Остальная часть программы

use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex

Очень просто: импортируйте встроенную MD5, затем напечатайте фиксированную строку, указанную в вопросе (сжимать ее не стоит, я считаю, что в Perl декомпрессор займет больше места, чем просто буквальное указание строки), и используйте встроенную MD5 на строка, которую мы получили через универсальный конструктор Quine.


источник
0

Node.js REPL (версия 0.9.3), 96 94 байта

Использование последней версии Node.js, существовавшей на момент публикации этого вызова. Я отследил документацию по шифрованию Node.js от 9 ноября 2012 года , и он поддерживал все функции, которые я использовал здесь в тот день.

function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)

Если вы не хотите устанавливать античную версию Node.js просто для тестирования этого кода, будьте уверены, он также работает в самой последней версии.

Node.js REPL (версия 7.0.0), 81 байт

А вот версия с использованием функций стрелок ES6.

x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)

Изменить : спасибо Anders Kaseorg за указание на ошибку в моей версии Node.js 0.9.3, исправление которой сохранило два байта.

user2428118
источник
Хотя все используемые вами функции могли поддерживаться Node.js 0.9.3, буквальный синтаксис шаблона ES6 не поддерживался `${s};x(x)`.
Андерс Касеорг
@AndersKaseorg Исправлено, спасибо. Оказывается, что не использование шаблонного литерала на самом деле экономит несколько байтов в версии Node.js 0.9.3.
user2428118