Şifreleme quine varyantı


22

Kaynaktaki MD5 toplamını formda basan bir program oluşturun:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Hile yok - kaynak dosyayı okuyamaz ve toplamını hesaplayamazsınız. Program herhangi bir harici bilgiyi okumamalıdır.

Elbette, diliniz için uygun olan bir MD5 kütüphanesini kullanabilirsiniz.


1
Birisi MD5 ile çarpışmayı başarırsa (yani, h = f (h), burada f, yazdırması için gereken tüm kod çöpü ile h için ham "tuz" olur), bunu yapmasına izin verilmesi gerektiğini düşünüyorum.
Nick T

1
@NickT Bu çok zor olurdu, ben de ekleyebilirim.
PyRulez

Yanıtlar:


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

Çıktı:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

İdeone'da doğrulama


Kaynak dosya için farklı bir md5sum alıyorum.
skeevey

@slackwear ne alıyorsun?
Matt

oh tekrar düzenledin. Şu anda 24ba0a79636297dab8803f571d4e3b44 md.pylinux
skeevey

1
Ben Yeni satır (eklerseniz @slackwear \nSana yayınlanmıştır karma olsun benim program sonunda): 24ba0a79636297dab8803f571d4e3b44. Fazladan bir yeni telefon hattınız olduğuna kesinlikle eminim. (Bazı editörlerin bunu otomatik olarak yapacağına inanıyorum)
Matt

2
Haklısın.
Vim'in LF'leri

12

Python 2, 91 bayt

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

Python quine varyantını kullanmak, her şeyin iki kez tekrarlanmasını gerektirmez. İdeone üzerinde test edilmiştir .


1
Bu kabul cevap olmalıdır
micsthepick

1

Perl + Digest :: MD5, 89 bayt

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

TIO bağlantısı yok, çünkü Digest :: MD5, TIO'da yüklü değil. Bunun, dil uygunluk seviyesinin 5.10 veya daha üstüne ayarlanmasını gerektirdiğini unutmayın ( -M5.010; bu, PPCG kurallarına göre bir bayt cezası taşımamaktadır.).

açıklama

Bu, başka bir "kaynak kodun bir fonksiyonunu basar" mücadelesidir, yani evrensel bir quine yapıcısı aracılığıyla önemsiz bir şekilde çözülebileceği anlamına gelir.

Üniversal quine yapıcı

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

Biz kullanmak q()başlatmak için dize gösterimini (yuva) $_, Perl argümanlar eksik için kullandığı "varsayılan" değişkeni. Sonra evaleksik bir argümanla karşılıyoruz, böylece içindeki dize q()değerlendirilir.

İçindeki dize q()tüm programın nasıl oluşturulacağının bir açıklamasıdır; Programın geri kalanını tam anlamıyla belirtiriz, ardından $_içindeki tüm dizeyi değiştirmek için çıkmaz işaretini kullanırız.

Böylece teknik, tüm programın kaynağında aynı içeriğe sahip bir dize oluşturur; bir parça üretmek için yazdırabiliriz. Bununla birlikte, ilk önce başka bir şey yapabiliriz, ancak evrensel bir incelik oluşturucu yapıyoruz.

Programın geri kalanı

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

Çok basit: bir MD5 yerleşikini içe aktarın, ardından soruda belirtilen sabit dizgiyi yazdırın (sıkıştırmaya değmez, Perl'de dekompresörün yalnızca dizgiyi ifade etmekten daha fazla yer alacağına inanıyorum) ve MD5 yerleşikini kullanın. evrensel quine yapıcısı üzerinden aldığımız dizge.


0

Node.js REPL (sürüm 0.9.3), 96 94 bayt

Bu görev gönderildiğinde mevcut olan Node.js dosyasının son versiyonunu kullanmak. Ben izini ettik 9 Kasım 2012 belgelerinde node.js' kripto modülü için ve buraya geri gün kullandığınız tüm fonksiyonları desteklemek yaptı.

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

Yalnızca bu kodu test etmek için Node.js'nin eski bir sürümünü yüklemek istemiyorsanız, en son sürümde de çalıştığından emin olabilirsiniz.

Node.js REPL (sürüm 7.0.0), 81 bayt

Ve burada ES6'nın ok fonksiyonlarını kullanan bir versiyon var.

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

Düzenleme : Anders Kaseorg'a Node.js 0.9.3 sürümümdeki bir hatayı işaret ettiğim için teşekkür ederim , bu da iki bayt kurtardı.


Kullandığınız tüm işlevler Node.js 0.9.3 tarafından desteklenmiş olsa da, ES6 şablonu değişmez sözdizimi `${s};x(x)`değildi.
Anders Kaseorg

@AndersKaseorg Sabit, teşekkürler. Bir şablon değişmezi aslında kullanmayan çıkıyor kaydeder Node.js 0.9.3 sürümündeki bazı baytları .
user2428118
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.