Kryptografische Quine-Variante

22

Erstellen Sie ein Programm, das die MD5-Summe seiner Quelle in der folgenden Form druckt:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Kein Schummeln - Sie können die Quelldatei nicht einfach lesen und ihre Summe berechnen. Das Programm darf keine externen Informationen lesen.

Natürlich können Sie eine für Ihre Sprache verfügbare MD5-Bibliothek verwenden.

Petr Pudlák
quelle
1
Wenn es jemandem gelingt, MD5 zu kollidieren (dh h = f (h), wobei f ein grobes "Salz" für h mit all dem Code-Müll ist, der zum Drucken benötigt wird), sollte es ihm meiner Meinung nach gestattet sein, dies zu tun.
Nick T
1
@ NickT Das wäre allerdings extrem schwierig, könnte ich hinzufügen.
PyRulez,

Antworten:

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

Ausgabe:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Überprüfung bei ideone

Matt
quelle
Ich erhalte eine andere MD5-Summe für die Quelldatei.
Skeevey
@slackwear was bekommst du?
Matt
oh du hast es nochmal bearbeitet Im Moment 24ba0a79636297dab8803f571d4e3b44 md.pybenutze ich md5sum unter Linux
skeevey
1
@slackwear , wenn ich eine neue Zeile (add \n) am Ende meines Programms bekomme ich den Hash Sie auf dem Laufenden: 24ba0a79636297dab8803f571d4e3b44. Ich bin mir ziemlich sicher, dass Sie einen zusätzlichen Zeilenumbruch haben. (Ich glaube, einige Redakteure werden dies automatisch tun)
Matt
2
Du hast Recht. Ich hatte
keine Ahnung,
12

Python 2, 91 Bytes

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

Verwenden der Python-Quine-Variante, bei der nicht alles zweimal wiederholt werden muss. Auf ideone getestet .

Sp3000
quelle
1
Dies sollte die akzeptierte Antwort sein
micsthepick
1

Perl + Digest :: MD5, 89 Bytes

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

Keine TIO-Verbindung, da Digest :: MD5 nicht auf TIO installiert ist. Beachten Sie, dass hierfür die Sprachkonformitätsstufe auf 5.10 oder höher eingestellt sein muss ( -M5.010dies ist gemäß den PPCG-Regeln nicht mit einer Byte-Strafe verbunden).

Erläuterung

Dies ist eine weitere Herausforderung, die darin besteht, eine Funktion des Quellcodes zu drucken, was bedeutet, dass sie mit einem universellen Quine-Konstruktor trivial gelöst werden kann.

Universeller Quine-Konstruktor

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

Wir verwenden die q()Zeichenfolgennotation (die verschachtelt), um $_die "Standard" -Variable zu initialisieren , die Perl für fehlende Argumente verwendet. Dann evalfehlt uns ein Argument, damit der String im Inneren q()ausgewertet wird.

Die Zeichenfolge in q()ist eine Beschreibung zum Erstellen des gesamten Programms. Wir geben den Rest des Programms buchstäblich an und verwenden dann ein Leerzeichen, $_um den gesamten String für das Innere zu ersetzen.

Die Technik erzeugt somit eine Zeichenkette mit identischem Inhalt zur Quelle des gesamten Programms; wir könnten es drucken, um eine Quine zu produzieren. Wir können es aber auch zuerst anders machen, indem wir einen universellen Quine-Konstruktor erstellen.

Der Rest des Programms

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

Ganz einfach: Importieren Sie eine in MD5 integrierte Zeichenfolge, und drucken Sie die in der Frage angegebene feste Zeichenfolge aus (es lohnt sich nicht, sie zu komprimieren. Ich glaube, dass der Dekomprimierer in Perl mehr Speicherplatz beansprucht als nur die wörtliche Angabe der Zeichenfolge), und verwenden Sie die in MD5 integrierte Zeichenfolge Die Zeichenfolge, die wir über den universellen Quine-Konstruktor erhalten haben.


quelle
0

Node.js REPL (Version 0.9.3), 96 94 Bytes

Verwenden der letzten Version von Node.js, die zum Zeitpunkt der Veröffentlichung dieser Herausforderung vorhanden war. Ich habe die Dokumentation für das Kryptomodul von Node.js vom 9. November 2012 aufgespürt und es hat alle Funktionen unterstützt, die ich hier früher verwendet habe.

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

Wenn Sie keine antike Version von Node.js installieren möchten, um diesen Code zu testen, können Sie sicher sein, dass er auch in der neuesten Version funktioniert.

Node.js REPL (Version 7.0.0), 81 Byte

Und hier ist eine Version, die die Pfeilfunktionen von ES6 verwendet.

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

Edit : Danke an Anders Kaseorg für den Hinweis auf einen Fehler in meiner Node.js 0.9.3-Version, durch den zwei Bytes eingespart wurden.

user2428118
quelle
Obwohl alle von Ihnen verwendeten Funktionen möglicherweise von Node.js 0.9.3 unterstützt wurden, wurde die Literal-Syntax der ES6-Vorlage `${s};x(x)`nicht unterstützt.
Anders Kaseorg
@AndersKaseorg Behoben, danke. Stellt sich heraus , keine Vorlage wörtliche tatsächlich verwenden spart einige Bytes in die Node.js 0.9.3 Version.
user2428118