ソースのMD5合計を次の形式で出力するプログラムを作成します。
MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
不正行為はありません。ソースファイルを読み取ってその合計を計算することはできません。プログラムは外部情報を読み取ってはなりません。
もちろん、あなたの言語で利用可能なMD5ライブラリを使用できます。
ソースのMD5合計を次の形式で出力するプログラムを作成します。
MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
不正行為はありません。ソースファイルを読み取ってその合計を計算することはできません。プログラムは外部情報を読み取ってはなりません。
もちろん、あなたの言語で利用可能なMD5ライブラリを使用できます。
回答:
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での検証
24ba0a79636297dab8803f571d4e3b44 md.py
はLinuxでmd5sumを使用しています
\n
プログラムの最後に改行()を追加すると、投稿されたハッシュが取得されます24ba0a79636297dab8803f571d4e3b44
。私はあなたが余分な改行を持っていることをかなり確信しています。(一部の編集者はこれを自動的に行うと思います)
s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s
すべてを2回繰り返す必要のないPython quineバリアントを使用します。イデオンでテスト済み。
$_=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コンストラクターを介して取得した文字列。
このチャレンジが投稿されたときに存在した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のアンティークバージョンをインストールしたくない場合は、最新バージョンでも機能することをご安心ください。
そして、これはES6の矢印関数を使用したバージョンです。
x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)
編集:Anders Kaseorgに、Node.js 0.9.3バージョンのエラーを指摘してくれたことに感謝します。
`${s};x(x)`
が、ES6テンプレートリテラル構文はサポートされていません。