क्रिप्टोग्राफिक क्वीन वेरिएंट


22

एक प्रोग्राम बनाएँ जो अपने स्रोत के MD5 योग को फॉर्म में प्रिंट करता है:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

कोई धोखा नहीं - आप केवल स्रोत फ़ाइल नहीं पढ़ सकते हैं और इसकी राशि की गणना कर सकते हैं। कार्यक्रम को किसी भी बाहरी जानकारी को नहीं पढ़ना चाहिए।

बेशक आप अपनी भाषा के लिए उपलब्ध एमडी 5 लाइब्रेरी का उपयोग कर सकते हैं।


1
अगर कोई एमडी 5 (यानी एच = एफ (एच), जहां एफ एक कच्चा "नमक" है, जिसे प्रिंट करने के लिए आवश्यक सभी कोड कचरे के साथ ज करने के लिए प्रबंधित करता है), मुझे लगता है कि उन्हें ऐसा करने की अनुमति दी जानी चाहिए।
निक टी

1
@ निकट यह बहुत मुश्किल होगा, हालांकि, मैं जोड़ सकता हूं।
प्युर्लेज़

जवाबों:


13

पायथन 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

विचारधारा पर सत्यापन


मुझे स्रोत फ़ाइल के लिए एक अलग md5sum मिल रहा है।
स्कीवे

@ स्लैकवियर आपको क्या मिल रहा है?
मैट

ओह आपने इसे फिर से संपादित किया है। अभी मुझे 24ba0a79636297dab8803f571d4e3b44 md.pyलिनक्स में md5sum का उपयोग करने को मिलता है
skeevey

1
@ स्लैकवियर अगर मैं \nअपने प्रोग्राम के अंत में एक नई पंक्ति ( ) जोड़ता हूं तो मुझे आपके द्वारा पोस्ट किया गया हैश मिल जाता है 24ba0a79636297dab8803f571d4e3b44:। मैं काफी हद तक निश्चित हूं कि आपके पास एक अतिरिक्त न्यूलाइन है। (मेरा मानना ​​है कि कुछ संपादक स्वचालित रूप से ऐसा करेंगे)
मैट

2
तुम सही हो। मैं इस बात से अनजान था कि
स्कीव्वे

12

पायथन 2, 91 बाइट्स

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

पायथन क्वीन वेरिएंट का उपयोग करना, जिसे दो बार सब कुछ दोहराने की आवश्यकता नहीं है। आइडोन पर परीक्षण किया गया


1
इसका स्वीकृत उत्तर होना चाहिए
micsthepick

1

पर्ल + डाइजेस्ट :: एमडी 5, 89 बाइट्स

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

कोई TIO लिंक नहीं है क्योंकि Digest :: MD5 TIO पर स्थापित नहीं है। ध्यान दें कि इसके लिए भाषा अनुरूपता स्तर 5.10 या इससे अधिक होना आवश्यक है ( -M5.010यह पीपीसीजी नियमों के अनुसार बाइट जुर्माना नहीं करता है।

व्याख्या

यह अभी तक एक और "स्रोत कोड के एक फ़ंक्शन को प्रिंट करें" चुनौती है, जिसका अर्थ है कि इसे सार्वभौमिक रूप से एक सार्वभौमिक क्वीन कंस्ट्रक्टर के माध्यम से हल किया जा सकता है।

सार्वभौमिक रानी निर्माता

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

हम q()स्ट्रिंग संकेतन (जो घोंसले) का उपयोग करते हैं $_, आरंभ करने के लिए , "डिफ़ॉल्ट" चर जिसे पेरल लापता तर्क के लिए उपयोग करता है। फिर हम evalएक लापता तर्क के साथ, ताकि अंदर स्ट्रिंग का q()मूल्यांकन हो जाए।

q()पूरे कार्यक्रम को बनाने के तरीके के अंदर स्ट्रिंग एक विवरण है; हम कार्यक्रम के बाकी हिस्सों को शाब्दिक रूप से निर्दिष्ट करते हैं, फिर $_अंदर के लिए पूरे स्ट्रिंग को स्थानापन्न करने के लिए एक unescaped का उपयोग करें ।

इस प्रकार तकनीक पूरे कार्यक्रम के स्रोत के समान सामग्री के साथ एक स्ट्रिंग बनाती है; हम इसे क्वाइल बनाने के लिए प्रिंट कर सकते थे। हम अन्य चीजें भी पहले कर सकते हैं, हालांकि, एक सार्वभौमिक क्वीन कंस्ट्रक्टर बना रहे हैं।

बाकी कार्यक्रम

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

बहुत सरल: एक एमडी 5 बिलिन का आयात करें, फिर प्रश्न में निर्दिष्ट निश्चित स्ट्रिंग को प्रिंट करें (यह इसे संपीड़ित करने के लायक नहीं है, मेरा मानना ​​है कि पर्ल में डीकंप्रेसर शाब्दिक रूप से स्ट्रिंग को बताते हुए अधिक जगह लेगा), और एमडीआर बिलिन का उपयोग करें तार हम सार्वभौमिक quine निर्माता के माध्यम से मिला है।


0

Node.js REPL (संस्करण 0.9.3), 96 94 बाइट्स

Node.js के अंतिम संस्करण का उपयोग करना जो इस चुनौती के पोस्ट होने पर मौजूद था। मैंने Node.js के क्रिप्टो मॉड्यूल के लिए 9 नवंबर, 2012 के दस्तावेज़ को नीचे ट्रैक किया है , और इसने उन सभी कार्यों का समर्थन किया है जो मैंने दिन में वापस उपयोग किए हैं।

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)

संपादित करें : मेरे Node.js 0.9.3 संस्करण में एक त्रुटि को इंगित करने के लिए एंडर्स कसेगोर के लिए धन्यवाद , फिक्सिंग जिसने दो बाइट्स को बचाया।


यद्यपि आपके द्वारा उपयोग किए जाने वाले सभी कार्य Node.js 0.9.3 द्वारा समर्थित हो सकते हैं, ES6 टेम्पलेट शाब्दिक सिंटैक्स `${s};x(x)`नहीं था।
एंडर्स कासोर्ग

@AndersKaseorg फिक्स्ड, धन्यवाद। टेम्प्लेट शाब्दिक का उपयोग नहीं करने पर वास्तव में Node.js 0.9.3 संस्करण में कुछ बाइट्स बचाता है
user2428118
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.