Varian kriptografi quine

22

Buat program yang mencetak jumlah MD5 dari sumbernya dalam formulir:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Tanpa kecurangan - Anda tidak bisa hanya membaca file sumber dan menghitung jumlahnya. Program tidak boleh membaca informasi eksternal apa pun.

Tentu saja Anda dapat menggunakan perpustakaan MD5 yang tersedia untuk bahasa Anda.

Petr Pudlák
sumber
1
Jika seseorang berhasil menabrak MD5 (yaitu h = f (h), di mana f adalah "garam" kasar untuk h dengan semua kode sampah yang diperlukan untuk mencetak), saya pikir mereka harus diizinkan untuk melakukan itu.
Nick T
1
@NickT Itu akan sangat sulit, saya dapat menambahkan.
PyRulez

Jawaban:

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

Keluaran:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Verifikasi di ideone

Mat
sumber
Saya mendapatkan md5sum yang berbeda untuk file sumber.
skeevey
@lackwear, apa yang kamu dapat?
Matt
oh Anda sudah mengeditnya lagi. Saat ini saya 24ba0a79636297dab8803f571d4e3b44 md.pymenggunakan md5sum di linux
skeevey
1
@slackwear jika saya menambahkan baris baru ( \n) pada akhir program saya saya mendapatkan hash Anda diposting: 24ba0a79636297dab8803f571d4e3b44. Saya cukup yakin bahwa Anda memiliki baris baru ekstra. (Saya yakin beberapa editor akan melakukan ini secara otomatis)
Matt
2
Anda benar. Saya tidak menyadari vim akan menyembunyikan trailing
LF
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

Menggunakan varian Python quine yang tidak perlu mengulang semuanya dua kali. Diuji pada ideone .

Sp3000
sumber
1
ini harus menjadi jawaban yang diterima
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

Tidak ada tautan TIO karena Digest :: MD5 tidak diinstal pada TIO. Perhatikan bahwa ini membutuhkan tingkat kesesuaian bahasa diatur ke 5.10 atau lebih tinggi ( -M5.010; ini tidak membawa penalti byte sesuai dengan aturan PPCG.

Penjelasan

Ini adalah satu lagi tantangan "cetak fungsi kode sumber", yang berarti bahwa hal itu dapat diselesaikan dengan sepele melalui konstruktor quine universal.

Konstruktor quine universal

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

Kami menggunakan q()notasi string (yang bersarang) untuk menginisialisasi $_, variabel "default" yang digunakan Perl untuk argumen yang hilang. Lalu kita evaldengan argumen yang hilang, sehingga string di dalam q()akan dievaluasi.

String di dalam q()adalah deskripsi cara membuat seluruh program; kita tentukan sisa program secara literal, lalu gunakan unescaped $_untuk mengganti seluruh string di dalam.

Teknik ini dengan demikian menciptakan string dengan konten yang identik dengan sumber seluruh program; kita bisa mencetaknya untuk menghasilkan quine. Kita juga bisa melakukan hal-hal lain terlebih dahulu, membuat konstruktor quine universal.

Sisa dari program ini

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

Sangat sederhana: mengimpor bawaan MD5, lalu mencetak string tetap yang ditentukan dalam pertanyaan (tidak layak untuk mengompresnya, saya percaya bahwa di Perl, dekompresor akan mengambil lebih banyak ruang daripada hanya menyatakan string secara harfiah), dan menggunakan MD5 bawaan pada string yang kami dapatkan melalui konstruktor quine universal.


sumber
0

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

Menggunakan versi Node.js terakhir yang ada saat tantangan ini diposting. Saya telah melacak dokumentasi 9 November 2012 untuk modul kripto Node.js, dan itu mendukung semua fungsi yang saya gunakan di sini pada hari itu.

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

Jika Anda tidak ingin menginstal versi antik Node.js hanya untuk menguji kode ini, yakinlah juga berfungsi di versi terbaru.

Node.js REPL (versi 7.0.0), 81 byte

Dan ini adalah versi yang menggunakan fungsi panah ES6.

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

Sunting : terima kasih kepada Anders Kaseorg karena menunjukkan kesalahan pada versi Node.js 0.9.3 saya, memperbaiki yang menyimpan dua byte.

pengguna2428118
sumber
Meskipun semua fungsi yang Anda gunakan mungkin telah didukung oleh Node.js 0.9.3, sintaks literal template ES6 `${s};x(x)`tidak.
Anders Kaseorg
@AndersKaseorg Tetap, terima kasih. Ternyata tidak menggunakan templat literal sebenarnya menyimpan beberapa byte di versi Node.js 0.9.3.
user2428118