इस चुनौती का लक्ष्य (अंततः) अपनी पसंद की भाषा में हर संभव पड़ाव कार्यक्रम का उत्पादन करना है। सबसे पहले यह असंभव लग सकता है, लेकिन आप इसे निष्पादन आदेश के बहुत सावधानी से विकल्प के साथ पूरा कर सकते हैं।
नीचे यह बताने के लिए एक ASCII चित्र है। कॉलम हर संभावित प्रोग्राम की संख्या का प्रतिनिधित्व करते हैं (प्रत्येक प्रोग्राम एक सीमित वर्णमाला से प्रतीकों की एक सीमित संख्या है)। प्रत्येक पंक्ति को उस कार्यक्रम के निष्पादन में एक विलक्षण कदम का प्रतिनिधित्व करते हैं। एक X
निष्पादन उस समय-कदम पर है कि कार्यक्रम द्वारा किया जाता प्रतिनिधित्व करते हैं।
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
जैसा कि आप बता सकते हैं, प्रोग्राम 2 और 4 रुकते नहीं हैं। यदि आप उन्हें एक-एक-समय पर निष्पादित करते हैं, तो आपका नियंत्रक अनंत लूप में फंस जाएगा जो कि प्रोग्राम 2 है और कभी भी आउटपुट प्रोग्राम 3 और उससे आगे नहीं होगा।
इसके बजाय, आप एक dovetailing दृष्टिकोण का उपयोग करें । पत्र पहले 26 चरणों के लिए निष्पादन के संभावित आदेश का प्रतिनिधित्व करते हैं। *
रों स्थानों पर जहां कि इस कार्यक्रम को रोक दिया है और outputted है कर रहे हैं। .
रों चरण हैं, जो अभी तक क्रियान्वित नहीं किया गया है।
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
लक्ष्य भाषा के लिए आवश्यकताएँ
लक्ष्य भाषा (एक समानांतर व्याख्या की जा रही है) ट्यूरिंग-पूर्ण होनी चाहिए। इसके अलावा, यह किसी भी भाषा हो सकता है जो कि ट्यूरिंग-पूर्ण है, जिसमें ट्यूरिंग-संपूर्ण उपशीर्ष बहुत बड़ी भाषाएं शामिल हैं। आप चक्रीय टैग सिस्टम नियमों जैसी चीजों की व्याख्या करने के लिए भी स्वतंत्र हैं। आपको परीक्षण करने के लिए एक भाषा बनाने की भी अनुमति है, जब तक आप यह दिखा सकें कि यह ट्यूरिंग-पूर्ण क्यों है।
एक उदाहरण के रूप में, यदि आप ब्रेनफैक का परीक्षण करना चुनते हैं, तो यह सबसे अच्छा है कि आप []-+<>
सबसेट का परीक्षण करें , क्योंकि इनपुट समर्थित नहीं है और आउटपुट को केवल फेंक दिया गया है (नीचे देखें)।
जब "कंट्रोलर" प्रोग्राम (जिसे आप गोल्फ कर रहे हैं) की बात आती है, तो कोई विशेष आवश्यकता नहीं है। सामान्य भाषा प्रतिबंध लागू होते हैं।
कार्यक्रमों की एक अनंत सूची कैसे बनाएं
अधिकांश प्रोग्रामिंग भाषाओं को एक परिमित वर्णमाला से प्रतीकों की एक श्रृंखला के रूप में दर्शाया जा सकता है। इस मामले में, बढ़ती लंबाई के क्रम में हर संभव कार्यक्रम की सूची को एन्यूमरेट करना अपेक्षाकृत आसान है। आपके द्वारा उपयोग की जाने वाली वर्णमाला लक्ष्य भाषा की आवश्यकताओं का प्रतिनिधि होना चाहिए । ज्यादातर मामलों में, यह मुद्रण योग्य ASCII है। यदि आपकी भाषा एक अतिरिक्त सुविधा के रूप में यूनिकोड का समर्थन करती है, तो आपको यूनिकोड वर्णों के हर संभव संयोजन का परीक्षण नहीं करना चाहिए, बस ASCII। यदि आपकी भाषा केवल उपयोग करती है, []-+<>
तो ASCII वर्ण "टिप्पणी" के विभिन्न संयोजनों का परीक्षण न करें। APL जैसी भाषाओं के अपने विशेष अक्षर होंगे।
यदि आपकी भाषा को कुछ गैर-वर्णनात्मक तरीके से वर्णित किया गया है, जैसे कि फ्रैक्ट्रन या ट्यूरिंग मशीन, तो सभी संभव वैध कार्यक्रमों की सूची बनाने के अन्य समान रूप से मान्य तरीके हैं।
कार्यक्रमों की बढ़ती सूची की व्याख्या करना
इस चुनौती का प्रमुख हिस्सा कार्यक्रमों की बढ़ती सूची के लिए एक समानांतर दुभाषिया लिखना है। इसके लिए कुछ बुनियादी कदम हैं:
- सूची में कार्यक्रमों की एक सीमित संख्या जोड़ें
- सूची पर प्रत्येक कार्यक्रम को व्यक्तिगत रूप से समय की एक सीमित अवधि के लिए व्याख्या करें। यह प्रत्येक के लिए एक निर्देश चरण प्रदर्शन करके पूरा किया जा सकता है। सभी राज्यों को बचाओ।
- सूची से सभी समाप्ति / त्रुटि-फेंकने वाले कार्यक्रमों को हटा दें
- स्वच्छ रूप से रुके * कार्यक्रम का उत्पादन करें
- सूची में कुछ और कार्यक्रम जोड़ें
- प्रत्येक कार्यक्रम को बदले में, पुराने कार्यक्रमों के निष्पादन को उठाते हुए छोड़ दें जहां यह छूट गया है
- सूची से सभी समाप्ति / त्रुटि-फेंकने वाले कार्यक्रमों को हटा दें
- स्वच्छ रूप से रुके * कार्यक्रम का उत्पादन करें
- दोहराना
* आपको केवल उन कार्यक्रमों को आउटपुट करना चाहिए जो सफाई से रोकते हैं। इसका मतलब है कि निष्पादन के दौरान कोई वाक्यविन्यास त्रुटियां या अनकही अपवाद नहीं थे। प्रोग्राम जो इनपुट मांगते हैं, उन्हें भी आउटपुट किए बिना समाप्त किया जाना चाहिए। यदि कोई प्रोग्राम आउटपुट का उत्पादन करता है, तो आपको इसे समाप्त नहीं करना चाहिए, बस आउटपुट को फेंक देना चाहिए।
अधिक नियम
- आपको परीक्षण किए गए कार्यक्रमों को शामिल करने के लिए नए थ्रेड्स नहीं करना चाहिए, क्योंकि यह होस्ट ओएस / अन्य सॉफ़्टवेयर पर समानांतरकरण का काम बंद करता है।
- संपादित करें: संभावित भविष्य की खामियों को बंद करने के लिए, आपको परीक्षण किए गए प्रोग्राम के कोड का
eval
एक हिस्सा (या किसी भी संबंधित फ़ंक्शन) की अनुमति नहीं है । आप दुभाषिया के कोड से एक कोडब्लॉक कर सकते हैं । (इन नियमों के तहत बीएफ-इन-पायथन जवाब अभी भी मान्य है।)eval
- यह कोड-गोल्फ है
- जिस भाषा में आप अपना सबमिशन लिखते हैं, वह वैसी नहीं होनी चाहिए, जिस भाषा का आप परीक्षण / आउटपुट कर रहे हैं।
- आपको यह मान लेना चाहिए कि आपकी उपलब्ध मेमोरी अनबाउंड है।
- ट्यूरिंग-पूर्णता साबित करते समय, आप यह मान सकते हैं कि इनपुट प्रोग्राम में हार्डकोड किया गया है, और आउटपुट को प्रोग्राम की आंतरिक स्थिति से पढ़ा जा सकता है।
- यदि आपका प्रोग्राम खुद को आउटपुट करता है, तो यह संभवतः गलत है या एक पॉलीग्लॉट है।
"If your program outputs itself, it is probably wrong or a polyglot."