暗号化されたクイネ亜種


22

ソースのMD5合計を次の形式で出力するプログラムを作成します。

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

不正行為はありません。ソースファイルを読み取ってその合計を計算することはできません。プログラムは外部情報を読み取ってはなりません。

もちろん、あなたの言語で利用可能なMD5ライブラリを使用できます。


1
誰かがMD5に衝突した場合(つまり、h = f(h)、ここでfは、hの粗い「塩」であり、印刷に必要なすべてのコードガベージを含む)、それを許可する必要があると思います。
ニックT

1
@NickTしかし、それは非常に難しいでしょう、私は追加するかもしれません。
PyRulez

回答:


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

出力:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

ideoneでの検証


ソースファイル用に別のmd5sumを取得しています。
skeevey

@slackwearあなたは何を得ていますか?
マット

もう一度編集しました。今、私24ba0a79636297dab8803f571d4e3b44 md.pyはLinuxでmd5sumを使用しています
-skeevey

1
@slackwear \nプログラムの最後に改行()を追加すると、投稿されたハッシュが取得されます24ba0a79636297dab8803f571d4e3b44。私はあなたが余分な改行を持っていることをかなり確信しています。(一部の編集者はこれを自動的に行うと思います)
マット

2
あなたは正しいです。vimが後続のLFを隠すことを知らなかった
-skeevey

12

Python 2、91バイト

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

すべてを2回繰り返す必要のないPython quineバリアントを使用します。イデオンでテスト済み。


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

Digest :: MD5がTIOにインストールされていないため、TIOリンクはありません。これには、言語適合レベルを5.10以上に設定する必要があることに注意してください(-M5.010;これは、PPCGルールに従ってバイトペナルティを持ちません。

説明

これは、もう1つの「ソースコードの関数を印刷する」という課題です。つまり、普遍的なquineコンストラクターを介して簡単に解決できるということです。

ユニバーサルキインコンストラクター

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

我々が使用するq()初期化するために、文字列表記(巣)$_、Perlは引数の欠落に使用する「デフォルト」変数。次にeval、引数が欠落しているため、内部の文字列q()が評価されます。

内の文字列q()は、プログラム全体の作成方法の説明です。プログラムの残りの部分を文字通り指定し、エスケープせ$_ずに文字列全体を内部に置き換えます。

したがって、この手法は、プログラムのソース全体と同じ内容の文字列を作成します。それを印刷してクインを作成することができます。ただし、他のことを最初に行うこともできますが、普遍的なキインコンストラクタを作成します。

プログラムの残りの部分

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

非常に簡単:MD5ビルトインをインポートし、質問で指定された固定文字列を出力します(圧縮する価値はありません。Perlでは、文字列をそのまま記述するよりも圧縮解除プログラムが多くのスペースを占めると思います)。 Universal Quineコンストラクターを介して取得した文字列。


0

Node.js REPL(バージョン0.9.3)、 96 94バイト

このチャレンジが投稿されたときに存在したNode.jsの最後のバージョンを使用します。Node.jsの暗号モジュールに関する2012年11月9日のドキュメントを追跡しましたが、これは私が以前ここで使用したすべての機能をサポートしていました。

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)

編集Anders Kaseorgに、Node.js 0.9.3バージョンのエラーを指摘してくれたことに感謝します。


使用したすべての関数はNode.js 0.9.3でサポートされている可能性があります`${s};x(x)`が、ES6テンプレートリテラル構文はサポートされていません。
アンデルスカセオルグ

@AndersKaseorg修正、ありがとう。Node.js 0.9.3バージョンでは、テンプレートリテラルを使用しないことが実際にいくつかのバイトを節約します。
user2428118
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.