Variante de quine cryptographique

22

Créez un programme qui imprime la somme MD5 de sa source sous la forme:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Pas de triche - vous ne pouvez pas simplement lire le fichier source et calculer sa somme. Le programme ne doit lire aucune information externe.

Bien sûr, vous pouvez utiliser une bibliothèque MD5 disponible pour votre langue.

Petr Pudlák
la source
1
Si quelqu'un parvient à entrer en collision avec MD5 (c'est-à-dire h = f (h), où f est un "sel" brut pour h avec tous les déchets de code nécessaires à l'impression), je pense qu'ils devraient être autorisés à le faire.
Nick T
1
@NickT Ce serait extrêmement difficile cependant, je pourrais ajouter.
PyRulez

Réponses:

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

Sortie:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Vérification chez ideone

Mat
la source
Je reçois une somme md5 différente pour le fichier source.
skeevey
@slackwear qu'est-ce que vous obtenez?
Matt
oh vous l'avez à nouveau édité. En ce moment, j'utilise 24ba0a79636297dab8803f571d4e3b44 md.pymd5sum sous linux
skeevey
1
@slackwear si j'ajouter une nouvelle ligne ( \n) à la fin de mon programme , je reçois le hachage que vous avez affichée: 24ba0a79636297dab8803f571d4e3b44. Je suis assez certain que vous avez une nouvelle ligne supplémentaire. (Je crois que certains éditeurs le feront automatiquement)
Matt
2
Vous avez raison. Je ne savais pas que Vim cacherait les
LF en
12

Python 2, 91 octets

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

Utiliser la variante Python quine qui ne nécessite pas de tout répéter deux fois. Testé sur ideone .

Sp3000
la source
1
cela devrait être la réponse acceptée
micsthepick
1

Perl + Digest :: MD5, 89 octets

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

Pas de lien TIO car Digest :: MD5 n'est pas installé sur TIO. Notez que cela nécessite que le niveau de conformité du langage soit défini sur 5.10 ou supérieur ( -M5.010; cela ne comporte pas de pénalité d'octet selon les règles PPCG.

Explication

C'est encore un autre défi "imprimer une fonction du code source", ce qui signifie qu'il peut être résolu de manière triviale via un constructeur de quine universel.

Constructeur universel de quine

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

Nous utilisons la q()notation de chaîne (qui imbrique) pour initialiser $_, la variable "par défaut" que Perl utilise pour les arguments manquants. Ensuite, nous avons evalun argument manquant, de sorte que la chaîne à l'intérieur du q()soit évaluée.

La chaîne à l'intérieur du q()est une description de la façon de créer le programme entier; nous spécifions le reste du programme littéralement, puis utilisons un non échappé $_pour substituer la chaîne entière à l'intérieur.

La technique crée ainsi une chaîne avec un contenu identique à la source entière du programme; nous pourrions l'imprimer pour produire une quine. Nous pouvons également lui faire d'autres choses en premier, en créant un constructeur de quine universel.

Le reste du programme

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

Très simple: importez un module intégré MD5, puis imprimez la chaîne fixe spécifiée dans la question (cela ne vaut pas la peine de le compresser, je crois qu'en Perl le décompresseur prendrait plus d'espace que de simplement énoncer la chaîne littéralement), et utilisez le module intégré MD5 sur la chaîne que nous avons obtenue via le constructeur de quine universel.


la source
0

Node.js REPL (version 0.9.3), 96 94 octets

Utilisation de la dernière version de Node.js qui existait lorsque ce défi a été publié. J'ai retrouvé la documentation du 9 novembre 2012 pour le module de chiffrement de Node.js, et il a pris en charge toutes les fonctions que j'ai utilisées ici à l'époque.

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

Si vous n'avez pas envie d' installer une version ancienne de Node.js juste pour tester ce code, soyez assuré qu'il fonctionne également dans la version la plus récente.

Node.js REPL (version 7.0.0), 81 octets

Et voici une version utilisant les fonctions fléchées d'ES6.

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

Edit : merci à Anders Kaseorg pour avoir signalé une erreur dans ma version Node.js 0.9.3, la correction qui a sauvé deux octets.

user2428118
la source
Bien que toutes les fonctions que vous avez utilisées aient été prises en charge par Node.js 0.9.3, la syntaxe littérale du modèle ES6 `${s};x(x)`ne l'était pas.
Anders Kaseorg
@AndersKaseorg Fixed, merci. Il s'avère que ne pas utiliser un modèle littéral enregistre en fait certains octets dans la version Node.js 0.9.3.
user2428118