क्विन प्रोग्राम या क्विन एक प्रोग्राम है जो निष्पादित होने पर अपना स्वयं का स्रोत कोड आउटपुट करता है। उदाहरण के लिए, एक क्विन अपने अंदर मौजूद फ़ाइल की सामग्री को प्रिंट करके या अपने स्वयं के प्रतिनिधित्व को प्रिंट करने के लिए आत्मनिरीक्षण क्षमताओं का उपयोग करके "खुद से बाहर कदम" नहीं रख सकता है। इसके बजाय, इसे अपने स्वयं के स्रोत कोड की गणना करनी होगी।
ऐसा प्रोग्राम बनाने का क्लासिक तरीका दो चरणों में होता है:
- इंटरपोलेशन के लिए प्लेसहोल्डर के साथ एक स्ट्रिंग वैरिएबल प्रारंभ करें।
- स्ट्रिंग को प्रिंट करें और उसे स्वयं में इंटरपोलेट करें।
सही स्ट्रिंग का चुनाव करना ही असली चुनौती है। यह तरीका हर भाषा में अलग-अलग होता है और वेरिएबल डिक्लेरेशन, सेमीकोलन और लाइन ब्रेक की ज़रूरत, ज़रूरी कोटेशन मार्क्स आदि पर निर्भर करता है। कोटेशन मार्क्स को संभालना दिलचस्प है; आपको बिना किसी कोटेशन मार्क का इस्तेमाल किए यह बताने का तरीका ढूंढना होगा कि उसे प्रिंट किया जाना चाहिए।
दे घुमा के
बैश की अधिकांश चीज़ों की तरह, यह प्रोग्राम एक दिलचस्प विचित्रता का उपयोग करता है। हालाँकि एकल उद्धरण मजबूत उद्धरण हैं और किसी भी चीज़ का विस्तार नहीं करते हैं, व्याख्या की गई है printf निर्दिष्ट कोड बिंदु वाले वर्णों के रूप में अष्टाधारी एस्केप वर्ण:
s='s=\47%s\47;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="")
जावास्क्रिप्ट
निम्नलिखित JavaScript क्विन Node.js पर चलती हैं। आप उपयोग करते हैं 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