Variante crittografica di quine


22

Crea un programma che stampa la somma MD5 della sua fonte nel modulo:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Nessun imbroglio: non puoi semplicemente leggere il file sorgente e calcolarne la somma. Il programma non deve leggere alcuna informazione esterna.

Ovviamente puoi usare una libreria MD5 disponibile per la tua lingua.


1
Se qualcuno riesce a scontrarsi con MD5 (cioè h = f (h), dove f è un "sale" grezzo per h con tutta la spazzatura del codice necessaria per stampare), penso che dovrebbero essere autorizzati a farlo.
Nick T

1
@NickT Sarebbe estremamente difficile, potrei aggiungere.
PyRulez,

Risposte:


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

Produzione:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Verifica presso ideone


Ricevo un md5sum diverso per il file sorgente.
skeevey,

@slackwear cosa stai ricevendo?
Matt

oh l'hai modificato di nuovo. Adesso 24ba0a79636297dab8803f571d4e3b44 md.pyutilizzo md5sum in linux
skeevey

1
@slackwear se posso aggiungere un ritorno a capo ( \n) alla fine del mio programma ho l'hash che avete inviato: 24ba0a79636297dab8803f571d4e3b44. Sono abbastanza certo che hai una nuova riga in più. (Credo che alcuni editori lo faranno automaticamente)
Matt

2
Hai ragione. Non ero a conoscenza del fatto che Vim avrebbe nascosto gli LF finali
skeevey

12

Python 2, 91 byte

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

Utilizzando la variante Quine di Python che non richiede di ripetere tutto due volte. Testato su ideone .


1
questa dovrebbe essere la risposta accettata
micsthepick

1

Perl + Digest :: MD5, 89 byte

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

Nessun collegamento TIO perché Digest :: MD5 non è installato su TIO. Si noti che ciò richiede che il livello di conformità della lingua sia impostato su 5.10 o superiore ( -M5.010; questo non comporta una penalità di byte in base alle regole PPCG.

Spiegazione

Questa è un'altra sfida "stampa una funzione del codice sorgente", il che significa che può essere banalmente risolto tramite un costruttore di quine universale.

Costruttore universale di quine

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

Usiamo la q()notazione di stringa (che nidifica) per inizializzare $_, la variabile "predefinita" che Perl usa per argomenti mancanti. Quindi abbiamo evalun argomento mancante, in modo che la stringa all'interno del q()venga valutata.

La stringa all'interno di q()è una descrizione di come creare l'intero programma; specifichiamo il resto del programma letteralmente, quindi usiamo un senza escape $_per sostituire l'intera stringa con l'interno.

La tecnica crea quindi una stringa con contenuti identici all'intera sorgente del programma; potremmo stamparlo per produrre un quine. Possiamo anche fare prima altre cose, creando un costruttore universale di quine.

Il resto del programma

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

Molto semplice: importa un built-in MD5, quindi stampa la stringa fissa specificata nella domanda (non vale la pena comprimerlo, credo che in Perl il decompressore occuperebbe più spazio rispetto alla semplice affermazione della stringa letteralmente) e usa il built-in MD5 su la stringa che abbiamo ottenuto tramite il costruttore di quine universale.


0

Node.js REPL (versione 0.9.3), 96 94 byte

Utilizzo dell'ultima versione di Node.js esistente al momento della pubblicazione di questa sfida. Ho rintracciato la documentazione del 9 novembre 2012 per il modulo crypto di Node.js e supportava tutte le funzioni che ho usato qui nel corso della giornata.

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

Se non hai voglia di installare una versione antica di Node.js solo per testare questo codice, stai certo che funziona anche nella versione più recente.

Node.js REPL (versione 7.0.0), 81 byte

Ed ecco una versione che utilizza le funzioni freccia di ES6.

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

Modifica : grazie a Anders Kaseorg per aver segnalato un errore nella mia versione 0.9.3 di Node.js, che ha risolto due byte.


Sebbene tutte le funzioni utilizzate siano state supportate da Node.js 0.9.3, la sintassi letterale del modello ES6 `${s};x(x)`non lo era.
Anders Kaseorg,

@AndersKaseorg Risolto, grazie. Si scopre che non usare un modello letterale salva effettivamente alcuni byte nella versione Node.js 0.9.3.
user2428118,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.