त्रुटि (या चेतावनी) quine वह भी एक नियमित quine है [बंद]


9

( एक पुराने प्रश्न पर इस टिप्पणी से प्रेरित होकर ।)

पृष्ठभूमि

एक त्रुटि क्वीन (जिसे "किमियन क्वीन" के रूप में भी जाना जाता है) एक ऐसा कार्यक्रम है, जो संकलित या चलाने पर, कंपाइलर / दुभाषिया / रनटाइम के कारण त्रुटि संदेश को प्रिंट करने का कारण बनता है जिसमें प्रोग्राम के समान पाठ होता है, और कुछ नहीं। इस चुनौती के प्रयोजनों के लिए, हम चेतावनी में शामिल करने के लिए, मोटे तौर पर "त्रुटि" को परिभाषित कर रहे हैं।

कार्य

इस चुनौती में, हम एक की तलाश कर रहे हैं जो भी एक त्रुटि है। जब निष्पादित किया जाता है, तो प्रोग्राम को अपने स्वयं के स्रोत कोड को सामान्य रूप से प्रिंट करना चाहिए (यानी त्रुटि / चेतावनी संदेश के रूप में नहीं); यह एक उचित क्वीन होना चाहिए (अर्थात प्रोग्राम के कुछ भाग को आउटपुट के एक अलग भाग को एन्कोड करना होगा)। इसके अतिरिक्त, कार्यक्रम को संकलित और निष्पादित करना भी कार्यक्रम के स्रोत कोड का कारण होना चाहिए - और कुछ नहीं - कार्यान्वयन द्वारा त्रुटि या चेतावनी संदेशों के रूप में मुद्रित किया जाना चाहिए। (ध्यान दें कि इसका मतलब है कि आप संकलन-समय त्रुटियों का उपयोग नहीं कर पाएंगे, उन भाषाओं में जहां प्रोग्राम को सामान्य रूप से निष्पादित करने से रोकते हैं।) इसलिए दूसरे शब्दों में, प्रोग्राम का स्रोत कोड दो बार मुद्रित किया जाएगा, प्रत्येक विधि के माध्यम से एक बार।

स्पष्टीकरण

  • ज्यादातर मामलों में, यह स्पष्ट होगा कि क्या है और एक त्रुटि / चेतावनी संदेश नहीं है; हम यहां दोनों के बीच अंतर नहीं कर रहे हैं। अस्पष्ट मामलों में, किसी भी पाठ के रूप में एक त्रुटि / चेतावनी संदेश को परिभाषित करें जो कि कार्यान्वयन द्वारा या तो आउटपुट है: 1. एक कमांड निष्पादित करने के अलावा किसी अन्य चीज के परिणामस्वरूप (या जो भाषा में निकटतम समतुल्य है); या 2. जो आउटपुट के रूप में इसे कमांड के इनपुट का हिस्सा नहीं था।
  • क्वीन की त्रुटि / चेतावनी वाले हिस्से को एक उचित क्वीन होने की आवश्यकता नहीं है (हालांकि ज्यादातर मामलों में यह संयोग से होगा, क्योंकि अधिकांश त्रुटि और चेतावनी संदेशों में निश्चित पाठ की काफी मात्रा होती है)।
  • यह कई त्रुटियों / चेतावनियों के उत्पादन के लिए कार्यक्रम के लिए स्वीकार्य है, जो एक साथ समाप्‍त होने पर कार्यक्रम के स्रोत का निर्माण करते हैं। यह आउटपुट त्रुटियों / चेतावनियों के लिए स्वीकार्य नहीं है जो स्रोत में प्रकट नहीं होती हैं।
  • कई चुनौतियों के विपरीत, कंपाइलर को दिए गए स्विच और प्रोग्राम का नाम, इस चुनौती में अत्यधिक प्रासंगिक होने की संभावना है। यह देखते हुए कि चुनौती अन्यथा संभव नहीं हो सकती है, मैं यहाँ लचीला होने को तैयार हूँ, हालाँकि यदि आप कार्यान्वयन को असामान्य तरीके से चलाते हैं, तो याद रखें कि PPCG नियम ऐसा करने के लिए एक बाइट जुर्माना वसूलता है (अतिरिक्त वर्णों की संख्या के बराबर) आपको कमांड लाइन पर एक प्रोग्राम चलाने के लिए सबसे कम "सामान्य" तरीके से जोड़ना होगा), और इस तरह आपको अपनी पोस्ट में जुर्माना का आकार निर्दिष्ट करना होगा। (उदाहरण के लिए, यदि आप जिस दुभाषिया का उपयोग कर रहे हैं, वह प्रोग्राम को फ़ाइल से पढ़ता है, और फ़ाइल नाम पर कोई विशेष प्रतिबंध नहीं है, तो प्रोग्राम को चलाने का सबसे छोटा सामान्य तरीका 1-वर्ण फ़ाइल नाम वाली फ़ाइल से होगा; इस प्रकार;
  • संकलक / दुभाषिया संस्करण जो आप उपयोग करते हैं वह अच्छी तरह से प्रासंगिक हो सकता है, इसलिए आपके प्रस्तुत करने के भाग के रूप में, कृपया एक विशिष्ट संकलक या दुभाषिया बताएं जिस पर आपका कार्यक्रम काम करता है, और किस संस्करण की आवश्यकता है। (उदाहरण के लिए, एक प्रस्तुतकर्ता हेडर में "C (gcc 6.2.0)" बता सकता है।)
  • ध्यान दें कि यह कार्य सभी भाषाओं में संभव नहीं हो सकता है। उन भाषाओं में जहां यह सबसे आसान तरीका है, एक त्रुटि या चेतावनी संदेश खोजने की संभावना होगी, जिसके लिए पाठ के कुछ सबसेट को अनुकूलित करना संभव है (संदेश में उद्धृत किसी चीज़ का नाम बदलकर; फ़ाइल नाम एक आम पसंद है; यहाँ, लेकिन केवल एक ही नहीं)। मैं विशेष रूप से प्रभावित (और आश्चर्यचकित) हो जाऊंगा यदि कोई व्यक्ति केवल त्रुटि और चेतावनी संदेशों का उपयोग करके ऐसा करने का तरीका ढूंढता है जिसका पाठ तय हो गया है।

विजय की स्थिति

यह है एक चुनौती है, इसलिए एक प्रविष्टि को बेहतर माना जाता है यदि इसकी एक छोटी बाइट गिनती हो। जैसे, एक बार जब आप अपना कार्यक्रम पूरी तरह से काम कर लेते हैं, तो आप इसे बाइट की संख्या को यथासंभव नीचे लाने के लिए अनुकूलित करना चाहते हैं। (हालांकि, पहले से ही एक छोटी प्रविष्टि होने पर निराश न हों, खासकर अगर यह एक अलग भाषा में हो; जो हम वास्तव में यहां देख रहे हैं वह किसी विशेष एल्गोरिथ्म या विचार को किसी प्रोग्राम के पीछे जितना संभव हो उतना छोटा करना है, लेकिन कई को देखकर विभिन्न भाषाओं में समाधान या विभिन्न सिद्धांतों पर भरोसा करने वाला हमेशा सार्थक होता है।)


2
जैसा कि मैंने चैट में कहा, मुझे लगता है कि पहला बुलेट पॉइंट अस्पष्ट है। ज्यादातर मामलों में, यह स्पष्ट हो जाएगा कि क्या है और एक त्रुटि / चेतावनी संदेश नहीं है जो केवल चर्चा और भाषा-विधि के लिए प्रारंभिक बिंदु के रूप में कार्य करता है।
डेनिस

@ डेनिस: मैं इस सिद्धांत से सहमत हूं कि स्थिति बहुत अच्छी नहीं है, लेकिन दूसरी ओर इसे सुधारने के लिए कोई ठोस तरीका नहीं सोच सकता; स्पष्ट रूप से त्रुटि संदेश वाली चीज़ों के अपवाद को हटाने से कुछ भाषाओं में कुछ बहुत ही अनपेक्षित स्थितियों की ओर बढ़ने की संभावना है, जो ठीक होने से अधिक नुकसान पहुंचा सकती है; अगर आपको लगता है कि आप इस प्रश्न को सुधार सकते हैं, तो मुझे इसे संपादित करने में कोई आपत्ति नहीं है (और मुझे नहीं लगता कि पीपीसीजी के प्रश्नों पर वैसे भी "स्वामित्व" होना चाहिए, हालांकि यह एक अलग मुद्दा है)

जैसा कि यह है, मुझे लगता है कि सवाल अस्पष्ट है और एक उद्देश्य वैधता मानदंड का अभाव है। मैं सहमत हूं कि मेरा प्रस्तावित परिवर्तन चीजों को और भी बदतर बना सकता है। कार्रवाई का एक संभावित कोर्स चुनौती को पकड़ में रखना होगा और इसे सैंडबॉक्स में बदलना होगा।
डेनिस

1
मैंने अब चुनौती को रोक दिया है। मुझे आशा है कि आप इसे सैंडबॉक्स में पुन: प्रस्तुत करने पर पुनर्विचार करेंगे। यह एक बहुत ही दिलचस्प विचार है, और इसे व्यर्थ जाने देना शर्म की बात होगी।
डेनिस

1
सैंडबॉक्स पोस्ट यहाँ है । (मैं उस प्रश्न में संपादन पर विचार कर रहा था, लेकिन यह पोस्ट को फिर से कतार में खड़ा कर देगा, जो कि अत्यधिक उल्टा होगा क्योंकि यह समस्याओं को हल करने के लिए फिर से खोलना कठिन हो जाएगा।)

जवाबों:


9

जावास्क्रिप्ट (फ़ायरफ़ॉक्स 50), 153 बाइट्स

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

व्याख्या

यहाँ विचार सबसे आसानी से परिवर्तनीय जेएस क्वीन के साथ शुरू करना था जो मैंने अभी तक पाया है:

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throwकीवर्ड यह अच्छी तरह से अपने स्वयं के कोड फेंक बनाने के लिए एक आसान तरीका है:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

हालाँकि, एक मामूली समस्या है: फ़ायरफ़ॉक्स ने फेंक दिया संदेश के साथ प्रस्तुत किया Error:। सौभाग्य से, Error: mycodeवास्तव में मान्य जावास्क्रिप्ट है! (इसके बारे में अधिक जानने के लिए, एमडीएन पर जाएं ।)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

ओह, यह गलत बात को सचेत करता है:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

चूंकि उद्धरण चिह्न अब कोड के प्रारंभ में uneval(x)+xनहीं है , इसलिए हमें सही परिणाम नहीं देगा। इसे ठीक करने का सबसे अच्छा तरीका नेस्टेड स्ट्रिंग के स्थान पर एक प्लेसहोल्डर जोड़ना है:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

उह, अब Error:त्रुटि संदेश में एक अतिरिक्त है। आइए इसे ठीक करके स्ट्रिंग को पतला करें:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

और अंत में, आउटपुट और त्रुटि संदेश दोनों कोड के समान हैं! मैं एक स्टैक स्निपेट जोड़ूंगा, लेकिन यह किसी भी ब्राउज़र में स्निपेट में काम नहीं करता है।


5

पायथन 2, 217 80 51 बाइट्स

अनुगामी लाइनफीड की आवश्यकता है।

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

इसे ऑनलाइन आज़माएं

मैंने एक साधारण रानी के साथ शुरुआत की:

s='s=%r;print s%%s';print s%s

फिर मैंने raiseफेंकने के लिए अंत में जोड़ा IOError

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

दुर्भाग्य से, ट्रेसबैक समस्या पैदा कर रहा था (मैं इसे पूरी तरह से दूर नहीं कर सकता था), और अपवाद का नाम हमेशा सामने की तरह मुद्रित किया गया था IOError: <code here>, भले ही मैंने ट्रेसबैक हटा दिया हो।

तब मुझे यह उपयोगी उत्तर मिला और मैंने इसे अपने उद्देश्यों के लिए संशोधित किया।

तब मैंने पाया कि मैं अपनी खुद की क्लास बनाना छोड़ सकता हूं और बस इस्तेमाल sys.exitकर सकता हूं, जिससे मेरा कोड बहुत कम हो जाएगा।


1
मुझे नहीं लगता कि यह चुनौती की युक्ति में त्रुटि की परिभाषा का अनुपालन करता है क्योंकि यह कमांड निष्पादित करने के अलावा किसी अन्य चीज के परिणामस्वरूप नहीं है और न ही यह कमांड के इनपुट का हिस्सा था जो इसे आउटपुट के रूप में उत्पादित करता था । उस ने कहा, सादे exitयहाँ ठीक काम करता है। की कोई जरूरत नहीं sys
डेनिस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.