Варіант криптографічної квінти


22

Створіть програму, яка друкує суму MD5 свого джерела у вигляді:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

Звичайно, ви можете використовувати бібліотеку MD5, доступну для вашої мови.


1
Якщо комусь вдасться зіткнути MD5 (тобто h = f (h), де f - сира "сіль" для h з усім кодом сміття, який необхідний для друку), я думаю, їм слід дозволити це робити.
Нік Т

1
@NickT Хоча, можу додати, це було б дуже важко.
PyRulez

Відповіді:


13

Пітон 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


Я отримую інший md5sum для вихідного файлу.
skeevey

@slackwear Що ти отримуєш?
Метт

о, ти знову це відредагував. Зараз я 24ba0a79636297dab8803f571d4e3b44 md.pyвикористовую md5sum в linux
skeevey

1
@slackwear якщо додати символ нового рядка ( \n) в кінці моєї програми я отримую хеш вас в курсі: 24ba0a79636297dab8803f571d4e3b44. Я впевнений, що у вас є додатковий новий рядок. (Я вірю, що деякі редактори це зроблять автоматично)
Метт

2
Ви праві. Мені невідомо, що vim
ховатиме затримки LF

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, який не потребує повторення всього два рази. Випробуваний на ideone .


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()- це опис того, як створити всю програму; решту програми ми вказуємо буквально, а потім використовуємо незмінену, $_щоб замінити всю рядок на внутрішню.

Таким чином, техніка створює рядок з однаковим вмістом для джерела всієї програми; ми можемо роздрукувати його, щоб отримати квінку. Ми також можемо спочатку робити інші речі до цього, зробивши універсальний конструктор 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, яка існувала під час публікації цього виклику. Я відстежив 9 листопада 2012 року документацію для криптомодуля Node.js, і він підтримував усі функції, які я використовував тут ще за той день.

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)

Редагувати : дякую Андерсу Касеоргу за те, що він вказав на помилку в моїй версії Node.js 0.9.3, виправивши яку зберегло два байти.


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

@AndersKaseorg Виправлено, дякую. Виявляється, що не використовується буквальний шаблон, фактично зберігається деякі байти у версії Node.js 0.9.3.
користувач2428118
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.