क्विन प्रोग्राम या क्विन एक प्रोग्राम है जो निष्पादित होने पर अपना स्वयं का स्रोत कोड आउटपुट करता है। उदाहरण के लिए, एक क्विन अपने अंदर मौजूद फ़ाइल की सामग्री को प्रिंट करके या अपने स्वयं के प्रतिनिधित्व को प्रिंट करने के लिए आत्मनिरीक्षण क्षमताओं का उपयोग करके "खुद से बाहर कदम" नहीं रख सकता है। इसके बजाय, इसे अपने स्वयं के स्रोत कोड की गणना करनी होगी।
ऐसा प्रोग्राम बनाने का क्लासिक तरीका दो चरणों में होता है:
- इंटरपोलेशन के लिए प्लेसहोल्डर के साथ एक स्ट्रिंग वैरिएबल प्रारंभ करें।
- स्ट्रिंग को प्रिंट करें और इसे स्वयं में प्रक्षेपित करें।
तरकीब यह है कि स्ट्रिंग को बिल्कुल सही बनाया जाए। इसे कैसे करना है यह हर भाषा में अलग-अलग होता है और यह इस बात पर निर्भर करता है कि वेरिएबल कैसे घोषित किया जाता है, अर्धविराम और नई पंक्तियों की आवश्यकता, आवश्यक उद्धरण चिह्न आदि। उद्धरण चिह्नों का प्रयोग दिलचस्प है; किसी को यह इंगित करने का एक तरीका खोजना होगा कि उद्धरण चिह्न को वास्तव में उद्धरण चिह्न का उपयोग किए बिना मुद्रित किया जाना चाहिए।
दे घुमा के
बैश की अधिकांश चीज़ों की तरह, यह प्रोग्राम एक दिलचस्प विचित्रता का उपयोग करता है। हालाँकि एकल उद्धरण मजबूत उद्धरण हैं और किसी भी चीज़ का विस्तार नहीं करते हैं, व्याख्या की गई है printf
निर्दिष्ट कोड बिंदु वाले वर्णों के रूप में अष्टाधारी एस्केप वर्ण:
s='s=%s;printf "$s" "$s"';printf "$s" "$s"
अजगर
पायथन में, प्रारूप विनिर्देशक वापस आता है %r
स्वचालित रूप से एकल उद्धरण। यदि कोड एक न्यूलाइन वर्ण के साथ समाप्त होता है तो यह सबसे आसान है:
s='s=%r;print(s%%s)';print(s%s)
यदि आप बिना लाइन ब्रेक वाला कोड चाहते हैं, तो आपको निम्नलिखित लिखना होगा:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
जावास्क्रिप्ट
निम्नलिखित जावास्क्रिप्ट क्विन नोड.जेएस के अंतर्गत चलते हैं। आप उपयोग करते हैं console.log
, जो हमेशा एक नई लाइन जोड़ता है, इसलिए प्रत्येक स्क्रिप्ट के अंत में एक नई लाइन की आवश्यकता होती है:
s="s=%j;console.log(s,s)";console.log(s,s)
निम्नलिखित कार्यक्रम भी दिलचस्प है: यह अपने संपूर्ण प्रतिनिधित्व को मुद्रित नहीं करता है, लेकिन यह इस तथ्य पर निर्भर करता है कि फ़ंक्शंस का एक निश्चित प्रतिनिधित्व होता है:
(function a(){console.log('('+a+')()')})()
अगला उदाहरण धोखाधड़ी के करीब है क्योंकि यह eval
इस्तेमाल किया गया:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
जंग
रस्ट अपने स्वरूपित प्रिंट मैक्रो में उद्धरणों में एक तर्क संलग्न करने का एक तरीका प्रदान करता है। हालाँकि, इस मैक्रो के लिए प्रिंट मैक्रो के पहले तर्क को एक स्ट्रिंग अक्षरशः होना आवश्यक है! इसलिए स्थितीय तर्क पहचानकर्ता का उपयोग करना सबसे अच्छा है:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
पीएचपी
यह PHP प्रोग्राम सोर्स कोड को एक स्ट्रिंग में संग्रहीत करके और फिर उस स्ट्रिंग का उपयोग करके काम करता है printf
आउटपुट. 39
ASCII वर्ण के लिए है '
, स्ट्रिंग में उद्धरणों को सही ढंग से संभालने के लिए:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
अंतिम लेकिन महत्वपूर्ण बात HQ9+ है, जिसे क्लिफ बिफले द्वारा विकसित किया गया है:
Q