Kryptograficzny wariant quine


22

Utwórz program, który drukuje sumę MD5 swojego źródła w postaci:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Bez oszukiwania - nie można po prostu odczytać pliku źródłowego i obliczyć jego sumy. Program nie może czytać żadnych informacji zewnętrznych.

Oczywiście możesz użyć biblioteki MD5 dostępnej dla twojego języka.


1
Jeśli komuś uda się zderzyć MD5 (tj. H = f (h), gdzie f jest surową „solą” dla h ze wszystkimi śmieciami wymaganymi do wydrukowania), myślę, że powinno się na to pozwolić.
Nick T

1
@NickT Byłoby to jednak niezwykle trudne, dodam.
PyRulez

Odpowiedzi:


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()

Wydajność:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Weryfikacja w ideone


Otrzymuję inną sumę md5 dla pliku źródłowego.
skeevey

@ slackwear co otrzymujesz?
Matt

och, edytowałeś to ponownie. W tej chwili 24ba0a79636297dab8803f571d4e3b44 md.pykorzystam z md5sum w
systemie

1
@slackwear jeśli dodać do nowej linii ( \n) na końcu moim programie mam hash ty pisał: 24ba0a79636297dab8803f571d4e3b44. Jestem całkiem pewien, że masz dodatkową nową linię. (Wierzę, że niektórzy redaktorzy zrobią to automatycznie)
Matt

2
Masz rację. Nie wiedziałem, że vim ukryje końcowe LF
y

12

Python 2, 91 bajtów

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

Korzystanie z wariantu quine Pythona, który nie wymaga powtarzania wszystkiego dwa razy. Testowany na ideonie .


1
to powinna być zaakceptowana odpowiedź
micsthepick

1

Perl + Digest :: MD5, 89 bajtów

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

Brak łącza TIO, ponieważ Digest :: MD5 nie jest zainstalowany na TIO. Zauważ, że wymaga to ustawienia poziomu zgodności języka na 5.10 lub wyższy ( -M5.010; nie wiąże się to z karą bajtową zgodnie z zasadami PPCG.

Wyjaśnienie

Jest to kolejne wyzwanie „wypisz funkcję kodu źródłowego”, co oznacza, że ​​można go w prosty sposób rozwiązać za pomocą uniwersalnego konstruktora quine.

Uniwersalny konstruktor quine

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

Do q()inicjalizacji używamy notacji łańcuchowej (która zagnieżdża) $_, „domyślnej” zmiennej, której Perl używa do brakujących argumentów. Następnie mamy evalz brakującym argumentem, aby łańcuch wewnątrz wartości był q()oceniany.

Ciąg wewnątrz q()jest opisem, jak stworzyć cały program; określamy resztę programu dosłownie, a następnie używamy nieskalowanego, $_aby podstawić cały ciąg znaków do środka.

W ten sposób technika tworzy ciąg o identycznej treści do źródła całego programu; moglibyśmy go wydrukować, by stworzyć quine. Możemy jednak najpierw zrobić inne rzeczy, tworząc uniwersalnego konstruktora quine.

Reszta programu

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

Bardzo proste: zaimportuj wbudowany MD5, a następnie wydrukuj stały ciąg znaków określony w pytaniu (nie warto go kompresować, uważam, że w Perlu dekompresor zajmowałby więcej miejsca niż tylko podanie ciągu literalnie) i używałby wbudowanego MD5 ciąg otrzymany przez uniwersalny konstruktor quine.


0

Node.js REPL (wersja 0.9.3), 96 94 bajty

Korzystanie z ostatniej wersji Node.js, która istniała w momencie opublikowania tego wyzwania. Wyśledziłem dokumentację z dnia 9 listopada 2012 r. Dotyczącą modułu kryptograficznego Node.js i obsługiwał on wszystkie funkcje, z których korzystałem tutaj w ciągu dnia.

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

Jeśli nie masz ochoty instalować starodawnej wersji Node.js tylko w celu przetestowania tego kodu, bądź pewien, że działa on również w najnowszej wersji.

Node.js REPL (wersja 7.0.0), 81 bajtów

A oto wersja wykorzystująca funkcje strzałek ES6.

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

Edycja : podziękowania dla Andersa Kaseorga za wskazanie błędu w mojej wersji Node.js 0.9.3, co naprawiło zapisanie dwóch bajtów.


Chociaż wszystkie używane funkcje mogły być obsługiwane przez Node.js 0.9.3, dosłowna składnia szablonu ES6 `${s};x(x)`nie była.
Anders Kaseorg,

@AndersKaseorg Naprawiono, dziękuję. Okazuje się, że nieużywanie szablonu dosłownie faktycznie zapisuje niektóre bajty w wersji Node.js 0.9.3.
user2428118,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.