रुकने की समस्या को हल करने के मेरे प्रयासों को स्वीकार करें


31

कृपया ध्यान दें: इसकी प्रकृति से, इस चुनौती की कल्पना को समझना मुश्किल है। संभवतः कम्प्यूटेशनल थ्योरी, या समकक्ष पृष्ठभूमि पढ़ने में कम से कम एक नए पाठ्यक्रम की आवश्यकता होती है। इसके अलावा, चुनौती ही कठिन है। इसका उत्तर देने के लिए अपनी पसंद की भाषा के कुछ सबसेट के लिए एक संपूर्ण दुभाषिया लिखने की आवश्यकता होगी, और न केवल यह बल्कि दुभाषिया को एक क्वीन की तरह कुछ के रूप में होना होगा। यदि आपका उत्तर यह सब नहीं कर रहा है, तो यह विशेष रूप से कल्पना को पूरा नहीं करता है।

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

मैंने कल्पना से मिलने वाले पहले उत्तर के लिए 500 अंक का इनाम देने का वादा किया था, और यह जो किंग के बीएफ जवाब से सम्मानित किया जाएगा ।

चुनौती

ऐलन ट्यूरिंग के असमानता का हल करने की समस्या का एक मोटा, सरल संस्करण कुछ इस प्रकार है:

मान लीजिए कि मैंने एक कार्यक्रम लिखा है, Fजो रुकने के कार्यक्रम को हल करने के लिए है। यही है, Fइनपुट के रूप में किसी अन्य प्रोग्राम के स्रोत कोड को लेता है, और F(G)माना जाता है कि 1यदि Gरुकता है, और 0अन्यथा।

लेकिन अगर मैं आपको अपना कार्यक्रम देता हूं Fतो आप एक और कार्यक्रम का निर्माण कर सकते हैं H, जो मेरे कार्यक्रम Hको इसके इनपुट के रूप में चलाता है । अगर F(H)लौटता है 0तो Hलौटता है 0, लेकिन अन्यथा यह जानबूझकर एक अनंत लूप में चला जाता है। यह एक विरोधाभास की ओर जाता है, और हमें यह निष्कर्ष निकालना होगा कि Fआखिरकार समस्या को हल नहीं किया जा सकता है।

आपका कार्य कार्यक्रम लिखना है H, लेकिन एक मोड़ के साथ: मैं आपको अपना कार्यक्रम नहीं देने जा रहा हूं। इसके बजाय, आपके प्रोग्राम को इनपुट के रूप में मेरे प्रोग्राम का सोर्स कोड प्राप्त होगा। अर्थात्:

  • आपका प्रोग्राम मेरे प्रोग्राम को इनपुट के रूप में, सोर्स कोड फॉर्म में प्राप्त करेगा । (जैसे फ़ाइल या कमांड लाइन इनपुट के रूप में, विवरण आपके ऊपर है।)

  • मेरा प्रोग्राम आपके प्रोग्राम के समान भाषा में लिखा जाएगा, और एक स्रोत कोड स्ट्रिंग के रूप में इनपुट भी लेता है।

  • तो मेरा कार्यक्रम रिटर्न 0जब दिए गए अपने कार्यक्रम इनपुट के रूप में, अपने कार्यक्रम को रोकने चाहिए (और बदले 0) जब दिया मेरा कार्यक्रम इनपुट के रूप में। ("पीछे हटने 0" का सही अर्थ आपके ऊपर है)

  • यदि मेरा प्रोग्राम रुक नहीं रहा है, या यदि यह 0आपके प्रोग्राम को इनपुट के रूप में दिए जाने के अलावा कुछ भी देता है , तो आपके प्रोग्राम को अनिश्चित काल तक चालू रखना चाहिए।

मोड़ यह है कि, बस इसे वास्तव में बहुत कठिन बनाने के लिए, आपको निम्नलिखित नियमों का पालन करना होगा:

  1. आप किसी भी तरह के बिल्ट-इन execया evalटाइप फ़ंक्शन का उपयोग नहीं कर सकते ।

  2. आप अपने स्वयं के प्रोग्राम के सोर्स कोड पर प्राप्त करने के लिए किसी भी "धोखा" विधियों का उपयोग नहीं कर सकते हैं। (उदाहरण के लिए, आप इसे "प्रोग्राम 'नामक फ़ाइल में सहेज नहीं सकते" और फिर open(program)आपके प्रोग्राम में हैं।)

इसका मतलब यह है कि आपके कार्यक्रम में किसी प्रकार का पागल सुपर-क्वीन होना चाहिए जो न केवल एक स्ट्रिंग के रूप में अपने स्वयं के स्रोत कोड को पुन: पेश कर सकता है, बल्कि यह उस भाषा को सही ढंग से पार्स करने और व्याख्या करने में भी सक्षम है जो इसमें लिखा गया है।

इसे थोड़ा कम पागलपन से कठिन बनाने के लिए, आपको अपनी चुनी हुई भाषा के सिर्फ एक (ट्यूरिंग-पूर्ण) सबसेट का उपयोग करने की अनुमति है। इसलिए यदि आपका प्रोग्राम पायथन में लिखा गया है और केवल तभी काम करेगा जब मेरे प्रोग्राम में केवल ifs और whileलूप्स और बेसिक स्ट्रिंग ऑपरेशंस होंगे, तो यह ठीक है जब तक आपका प्रोग्राम केवल उन चीजों का भी उपयोग करता है। (इसका मतलब है कि आपको अपनी चुनी हुई भाषा के पूरे मानक पुस्तकालय को लागू करने के बारे में चिंता करने की ज़रूरत नहीं है!) हालांकि, आपके कार्यक्रम को वास्तव में चलाना पड़ता है - आप बस अपनी भाषा नहीं बना सकते हैं।

यह , इसलिए सबसे अधिक वोटों के साथ जवाब जीत जाता है। हालांकि, जैसा कि ऊपर उल्लेख किया गया है, यह सिर्फ एक गंभीर चुनौती है कि आप सभी को युक्ति से मिलें, इसलिए मैं अपने निर्णय के अनुसार ऐसा करने वाले पहले उत्तर के लिए 500 अंक का इनाम दूंगा।

कृपया ध्यान दें: इसमें कोई संदेह नहीं है कि इस चुनौती पर "धोखा" देने के कई तरीके हैं, जिसे मैंने इस्तेमाल किया है। हालांकि, मैं वास्तव में उन सवालों के जवाब की उम्मीद कर रहा हूं जो प्रश्न की भावना में प्रवेश करते हैं। इरादा के रूप में चुनौती बहुत मुश्किल है लेकिन संभव है, और मैं वास्तव में इसके वास्तविक समाधान देखने की उम्मीद कर रहा हूं। मैं उस जवाब को इनाम नहीं दूंगा जो मेरे फैसले में धोखा महसूस करता है।


नोट: यह चुनौती मूल रूप से रूप में पोस्ट की गई , लेकिन 2016 में "उद्देश्य जीतने की कसौटी" नहीं होने के कारण इसे बंद कर दिया गया था, और मैंने इसे फिर से खोलने के लिए इसे में बदल दिया । हालांकि, मैंने पाया है कि जनवरी 2018 तक, वास्तव में पीपीसीजी पर प्रतिबंध नहीं है ( यह सबसे हालिया मेटा चर्चा होने के साथ ) इसलिए इसे पहले स्थान पर बंद करना साइट नीति के खिलाफ था। मैं समझता हूं कि पॉपकॉइन इन दिनों लोकप्रिय नहीं हैं, लेकिन यह एक पुरानी चुनौती है, और इसकी प्रकृति लिए वास्तव में अनुपयुक्त हैस्कोरिंग प्रणाली। अगर किसी को अभी भी दृढ़ता से लगता है कि इसे अनुमति नहीं दी जानी चाहिए, तो आइए एक मेटा चर्चा करें इससे पहले कि करीबी वोटों को चारों ओर फेंकना शुरू करें। अंत में, इस अवसर पर कि किसी ने अंतिम वर्ष अपने समाधान के लिए गोल्फ का प्रयास करते हुए बिताया, बाकी लोगों ने आश्वासन दिया कि यह इस चुनौती में उतना ही प्रतिस्पर्धी होगा, और उतने ही योग्य होगा, जितना कि यह संस्करण।


1
लौटने से क्या आपका मतलब एक्जिट कोड या स्टडआउट से है? या दोनों स्वीकार्य हैं?
प्लाज़्मापावर

दोनों स्वीकार्य हैं।
नथानिएल

@ नथानियल मैं इसे Fएक फ़ाइल में प्राप्त कोड को निर्यात करना और importइसे आईएनजी के लिए अवैध होगा ? ; 3
cjfaure

1
मुझे यह सवाल बहुत पसंद है लेकिन इसे समझना कठिन है। अगर किसी और को परेशानी हो रही है, तो इन दो स्लाइड्स (जावा में psuedocode) ने मेरे लिए यह समझना बहुत आसान बना दिया: imgur.com/a/NRmyO
हैरी

1
आप "प्रश्न की भावना" और "वास्तविक समाधान" का उल्लेख करते हैं। उससे तुम्हारा क्या मतलब है? क्या हम अपनी भाषा के लिए एक दुभाषिया खुद लिखने वाले हैं? मैं इसे करने के लिए दूसरे तरीके की कल्पना नहीं कर सकता।
केएसएफटी

जवाबों:


23

ब्रेनफक , 6013 4877 4376 बाइट्स

संपादित करें: -1136 बाइट्स क्वीन के लिए डेटा उत्पन्न करने के एक बेहतर तरीके पर स्विच किया गया

Edit2: -501 बाइट्स। मेरे स्व-व्याख्याकार पर फिर से विचार करें और इसे दो सौ बाइट्स काट दें

->++>++++>+>++>+++>>++++>>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>++++>++++>>+++>>++++>>+++>>++>++>++>++>++>++>++>++++>+++++>+>++>++>++>++>++>++>>+++>+>++>++++>+>+++>+>++++>+>+++>+>++>>>+++++>+++>>+++>+>+++++>+++++>++++>>++>+>++>++>++>++>++>++>+++>>++>++>>++++>>+++>++>++>++>++>++>++++>+++++>>++>++>++>+>+++>>++++>>++>++>++>>++>++>++>>++>++>++>>++>++>++>++>++>++>>++>++>++>++>++>++>>++>++>++>>++>++>++>++>>++>++>++>++>++++>+>+++>>+++++>+++>>++>>+++++>>>++>>++>++>++>>+++++>+++++>>>++>++>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>++++>++++>++++>>+++>>>++++>>+++>>>++++>>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++++>+++>>++++>>+++>>>++++>>+++>>>++++>>+++>>>++++>+++++>+>+>++>++++>+>+++>+>++>>>++++>>+++>>+++>+>+>++++>++++>+++++>>++>+>+++>+>+++>>>++++>>+++>>++++>++++>+++++>+>++>>+++>>+++>+>+>++++>+>+++>+>+>++++>+>+++>+>+>++++>+>+++>>+++>>>>++++>>+++>>>++++>>+++>+>++++>++++>+++++>+++>+>+++>>>>++++++>++++>>++>++>++>++>++>++>++>++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++++>+++>++>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>++>+>++>>>>>+++>+>+>+>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>>>>>+++>+>+>+>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>+++++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>++>++>++>++>++>++>>>>>+++>+>+>++>++>++>++>++++>+++++>+>+++++>+++++>+++++>+++++>+++++>+++++>>+++>++>+>++>++++>>+++>>++++>+>++>++>+>++>>>>>+++>+>+>+>+++++>+++++>++++>>+++>>++++>+>+++++>+>++>>>>>+++>+>+>+++++>+>++++>++>+++>+>++++>>+++>>++++++>+++>>>>++>+>+>+>+>+++++>++++>+>+++>>++++>+++++>++++>+>+>+++>>++++>+>++>++++>>+++>>>++++>+>+++>+>+>++++>>>++>++++>+>+>++++>+>+++>+>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>++>+>+>++++>+>+++>+>+++>+>+++++>++++>>>+++>+>++++>>>>>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>+>++>++>++++>+++++>>>++>+>+>+++>>>++++>>+++>>+++>+>+++>+>++++>+>+++>>+++++>+>+++>>+++++>++++>+>+>+++>>++++>+>++>++>++++>>+++>>>++++>+>+>+++>>++++>+>+>++>++++>+>+>++++>+>+++>>++++>+++++>+>+>++>>>+++>>+++++>+++++>++++>+>+>+++>>++++>++++>>+++>>++>+>+>++++>+>+++>+>+++>>++>++++>+>+>+++>>++++>++++>>+++>>+++++>+>+>++++>+>+++>+>+++>>++>++++>>+++>>+++>+++>+>+>++++>+>+++>>+++++>+++++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>+++++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++++++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>++++>++++>>+++>>++++>>+++>>>>++++>>+++>>>++>+>+>+>++++>+>+++>+>+>+>++++>+>+++>+>++++>+>+++>>+++++>+++>>++++>>+++>>++++>>+++>>>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>++>+>+>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>>>++++>>>+++>>++++>+>+>+>++++>+>+>+++>+>++>>>>++++>>>+++>>+++++>+++>>++++>+++++>+++>+>+>++>++++>+>++++>+++++>>>++>+>+>+++>+>+++>+>++++>+++++>>>++>+>+>+++>+>++++>+>+++>+>+++>>+++++>++++>+>+>+++>>++++>++++>>+++>>++>++>++++>+++++>+++++>>++++>+++++>+>+>++>>>+++>>+++>++>+>+>+++++>++++>++>++>+>+>+++>+>++++>+++++>>>>++++>>>+++>>++>+>+>+>++++>+>+>+++>+>+++>+>++++>+>+++>+>+++>+>++>++>++>++>++>++>++>++>>>++++>++>+>+>+++++>>>+++>>+++>>>++++>++++[<+]>[>[>]>[>]>++++++++++[-<++++++>]<++[<]<[<]<+>>-[[>]>[>]>+++++++[-<++++++>]<+[<]<[<]<+>>-]>]<--[>+<++++++]>++>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]>+>->>+>+++>-->>++[<]<<[<]<<[<]>[[[>]>>[>]>>[>]<[->>+<<]<[<]<<[<]<<[<]>-]>[>]>>[>]>>[>]>>[-<<+[<]<+>>[>]>]<<[[->+<]<]>>[>]>[[-<+>]>]<<[<]<<[<]<<[<]>]>>>[>]>>[>]<[[-]<]>>>,[>+++++++[<------>-]+<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<+<+>>>>]<<<-[>]>[<-<+++>>>>]<<<--------------[>]>[<++<+>>>>]<<<--[>]>[<-<+++++++>>>>]<<++++[-<------>]+<+[>]>[<++<+>>>>]<<<--[>]>[<-<+>>>>]<<-<[+]<[>]>,]>>>+<<<<-[<]>[-[<<]>[<+[>]>>[<]<<[>>+[<<[<]<<-[>>]<[>>>>[>]>+<<[<]<]<-[>>]<[>>>>[>]>-<<[<]<]<++[->>+<<]>>[>]>]<]<[<]>-<]>-[<<]>[<++[>]>>[<<]>[<<+[<<[<]>[-<<+>>]>--[<<]>[[>]>+<<[<]<]>+[<<]>[[>]>-<<[<]<]>+[>]>]]<<[<]>--<]>-[<<]>[[>]>>.<<<[<]<]>-[<<]>[[>]>>-<<<[<]<]>-[<<]>[[>]>>,<<<[<]<<<[<]<[<]>[[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]>[>]>[>]>>[<]<]>-[<<]>[[>]>>+<<<[<]<]>-[<<]>[[>]>>>[>>]>[<<<[<<]<+>>>[>>]>-]>[-]<<+[<[->>+<<]<]<[->>+<<]<[<]<]>-[<<]>[[>]>++[-->[-<<+>>]>]+<<-[++<<]<[->>>[>>]>+<<<[<<]<]<[<]<]<++++++++>>[+<<->>]>]>>[]

इसे ऑनलाइन आज़माएं! यहां इनपुट एक सरल बिल्ली प्रोग्राम (,[.,]) है जो प्रोग्राम को स्वयं प्रिंट करेगा।

"रिटर्न 0" को मान 0 के साथ एक सेल पर प्रोग्राम को समाप्त करके परिभाषित किया गया है।

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

यह काम किस प्रकार करता है:

भाग 1: डेटा जनरेशन

->++>++++> ....... >+++++>>>+++>>+++>>>++++>+++

यह हिस्सा क्वीन के डेटा सेक्शन को बनाता है, और अब तक 3270 बाइट्स में अधिकांश कोड है। शुरुआत -डेटा की शुरुआत के लिए एक मार्कर है। प्रत्येक >+++इस खंड के बाद कोड के एक चरित्र का प्रतिनिधित्व करता है।

Number of Pluses
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
> | < | + | ] | [ | - | , | . |

भाग 2: डेटा का उपयोग करके डेटा अनुभाग उत्पन्न करें

+[<+]>

[
    Add a right arrow
    >[>]>[>]>(10++++++++++)[-<(6++++++)>]<++[<]<[<]
    <+>>-
    Add the right amount of pluses
    [
        [>]>[>]>(7+++++++)[-<(6++++++)>]<+[<]<[<]<+>>-
    ]
    >
]
Add the beginning minus
<--[>+<++++++]>++

यह कोड अनुभाग में डेटा को उत्पन्न करने के लिए उपयोग किए जाने वाले वर्णों को जोड़ने के लिए भाग एक से डेटा का उपयोग करता है। यह >कोड अनुभाग के अंत में जोड़ता है और उस सेल का मूल्य कई प्लस होता है।

भाग 3: डेटा का उपयोग करके शेष कोड उत्पन्न करें

Initialises the 8 characters of brainfuck
>[>]+++++[->+++<]>[>+++>+++>+++>++++++>++++++>+++>++++>++++[<]>-]
>+>->>+>+++>-->>++[<]<<[<]<<[<]>

Tape looks like:
data 0 0 code 0 0 characters

Runs through the data destructively and adds the represented symbol to the code section
[
    [
        For each plus in this cell
            Shift the gap in the characters over one
        [>]>>[>]>>[>]<[->>+<<]
        <[<]<<[<]<<[<]>-
    ]
    Navigate to character
    >[>]>>[>]>>[>]>>
    Copy the character to the end of the code section
    [-<<+[<]<+>>[>]>]

    Shift the symbol section over one
    <<[[->+<]<]
    >>[>]>[[-<+>]>]

    Navigate to next byte of data
    <<[<]<<[<]<<[<]>
]

Remove characters
>>[>]>>[>]<[[-]<]

डेटा सेक्शन को नष्ट कर देता है और बाकी सोर्स कोड को कोड सेक्शन में जोड़ देता है

भाग 4: इनपुट प्रोग्राम प्राप्त करें

>>>,
[
    >(7+++++++)[<(6------)>-]+<-
    [>]>
    [plus <+<+>>>>]<<<
    -[>]>
    [comma <+<+>>>>]<<<
    -[>]>
    [minus <+<+>>>>]<<<
    -[>]>
    [dot <-<+++>>>>]<<<
    (14--------------)[>]>
    [left <++<+>>>>]<<<
    --[>]>
    [right <-<+++++++>>>>]<<
    (29++++[-<------>]+<+)
    [>]>
    [start loop <++<+>>>>]<<<
    --[>]>
    [end loop <-<+>>>>]<<
    -<[+]<[>]>,
]

इनपुट प्रोग्राम हो जाता है। गैर-दिमाग वर्णों को हटाता है और प्रत्येक वर्ण को एक संख्या के साथ दर्शाता है:

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
] | [ | . | - | , | + | > | < |

के साथ कार्यक्रम के अंत का प्रतिनिधित्व करता है 255

भाग 5: इनपुट की व्याख्या करना

Initialise simulated tape
>>>+<<<<-

[<]>
[
    -[<<]>
    [end loop
        co 0 0 0 e:  _1 0 0 0 1 ?
        Check if current cell is one
        <+[>]>>[<]<<
        co 0 0 1 e _1: 0 0 !0 1
        or
        co 0 0 1 e _1 0: 0 0 1
        [ If current cell is one navigate to corresponding start loop
            Create counter
            >>+
            [
                co 0 0 de _1 0 c: !0 1
                checks if next instruction is an end loop
                <<[<]<<-
                [>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>+<<[<]<] Add one to counter if it is
                checks if start loop
                <-[>>]<
                c !0 0: 0 de _1 0 c !0 1
                or
                c: 0 0  0 de _1 0 c !0 1
                [>>>>[>]>-<<[<]<] Subtract one from counter if it is
                c ? 0: 0 de _1 0 c !0 1
                Adds two to counteract checks and move to the next instruction
                <++[->>+<<]
                >>[>]>
                c 0 0 ode _1 0 c: !0 1
                End on the counter
                    If the counter is 0 then we have reached the corresponding bracket
            ]
            c 0 0 2 de _1 0 0: !0 1 0
            <
        ]
        c 0 0 1?2 de _1 0: 0 0 1 0
        Subtract one from current instruction
            This executes the start loop code next but that does nothing
        <[<]>-<
    ]
    >-[<<]>
    [start loop
        c 0 0 0 de:  _1 0 0 ? 1
        <++[>]>>[<<]>
        c 0 0 2 de _1 0 0 0 1:
        or
        c 0 0 2 de _1 0 0: !0 1
        [ If current cell is 0 navigate to corresponding end loop
            Initialise counter
            <<+
            c 0 0 ode _1 0 c: 0 1
            [ While counter is not 0
                Transfer current instruction over (first instruction is guaranteed to be start loop)
                <<[<]>[-<<+>>]>
                co 0 0 de _1 0 c: 0 1
                Check if start loop
                --[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e _1 0 c 0 1
                [[>]>+<<[<]<] Add one to counter if so
                checks if end loop
                >+[<<]>
                co 0 0: !0 e _1 0 c 0 1
                or
                co 0 0 0 e:  _1 0 c 0 1
                [[>]>-<<[<]<] Subtract one from counter if so
                Add one to counteract checks and navigate to counter
                >+[>]>
                co 0 0 de _1 0 c: 0 1
                End on counter
                    If counter is 0 then we have reached the corresponding end loop
            ]
            co 0 1 e _1 0 0: 0 1
        ]
        co 0 0 2?1 e _1 0 0: ? 1
        Subtract two from the current instruction to bring it back up to the right value
        <<[<]>--<
    ]
    3 of these are pretty self explanatory
    Navigate to the current cell and execute the instruction on it
    >-[<<]>
    [output
        [>]>>.<<<[<]<
    ]
    >-[<<]>
    [minus
        [>]>>-<<<[<]<
    ]
    >-[<<]>
    [input
        Reset current cell
        [>]>>, (no more input so this is set to 0)
        co 0 0 0 e:  _1 0 0 0: 1 b 1 a 0 d 1 e 1 f
        Navigate to start of code section
        <<<[<]<<<[<]<[<]>
        d: ata 0 co 0 0 0 e _1 0 0 0 1 b
        or
        0: co 0 0 0 e _1
        Transfer next instruction to current cell
        [[>]>[>]>>>[>]>>+<<<[<]<<<[<]<[<]>-]
        0: ata 0 co 0 0 0 e _1 0 0 d 1 b
        or
        0: co 0 0 0 e _1
        Navigate back to the normal spot
        >[>]>[>]>>[<]<
    ]
    >-[<<]>
    [plus
        [>]>>+<<<[<]<
    ]
    >-[<<]>
    [right
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0 e:  _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Navigate to value of cell to the right
        [>]>>>[>>]>
        co 0 0 0 e _1 0 0 c 1 b 1 a 0 d: 1 e 1 f
        Transfer it to temporary cell
        [<<<[<<]<+>>>[>>]>-]
        co 0 0 0 e _1 d 0 c 1 b 1 a 0 0: 1 e 1 f
        Pop extra marker if it exists from the right cells and add one to the left
        >[-]<<+
        co 0 0 0 e _1 d 0 c 1 b 1 a 1: 0 0 e 1 f
        Transfer all left cells over 2 cells
        [<[->>+<<]<]<[->>+<<]
        co 0 0 0 e _1 0: 0 d 1 c 1 b 1: a 0 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    >-[<<]>
    [left
        Simulated tape looks like:
            a b c: d e f
        co 0 0 0: e _1 0 0 c 1 b 1 a 0 d 1 e 1 f
        Add temporary marker
        [>]>++
        co 0 0 0 e _1 0 2: c 1 b 1 a 0 d 1 e 1 f
        Remove temporary marker and transfer all left cells over two
        [-->[-<<+>>]>]
        co 0 0 0 e _1 c 0 b _1 a _1 0 0: d 1 e 1 f
        Add marker to right cells remove marker from left cells and reset left cell's markers
        +<<-[++<<]<
        co 0 0 0 e _1 c: 0 b 1 a 0 0 1 d 1 e 1 f
        Transfer current cell to to right cells
        [->>>[>>]>+<<<[<<]<]
        co 0 0 0 e _1 0: 0 b 1 a 0 c 1 d 1 e 1 f
        Navigate back to normal spot
        <[<]<
    ]
    Add 8 to reverse checks
    <(8++++++++)>>

    Execute next instruction
    [+<<->>]>
]

कार्यक्रम की व्याख्या करता है। एक सामान्य से एकमात्र अंतर यह है कि इनपुट के बजाय कोड अनुभाग की शुरुआत से इनपुट लिया जाता है।

भाग ६: वापसी अगर ० नहीं है

>>[]

अपने प्रोग्राम के अंतिम सेल पर नेविगेट करें और एक अनंत लूप चलाएं यदि रिटर्न 0 नहीं है। यदि यह 0 है, तो लूप से बाहर निकलें और उसी 0 पर समाप्त करें।

परीक्षण इनपुट:

हमेशा 0 रिटर्न (हाल्ट और रिटर्न 0)

(empty program)

हमेशा 1 रिटर्न (हमेशा के लिए रन)

+

सभी इनपुट को एक साथ जोड़ा गया, मोड 256 (रिटर्न 211, इसलिए यह हमेशा के लिए चलता है)

,[[->+<],]>

रिटर्न 0 यदि किसी कोड के अंतिम दो अक्षर अनंत लूप हैं ( []) ( आपका प्रोग्राम मेरे प्रोग्राम को दिए जाने पर 0 वापस हो जाता है , इसलिए मेरा प्रोग्राम रुक जाता है)

,[>,]>(9+++++++++)[-<(10++++++++++)>]<[-<-<->>]+<---[[-]>[-]<]<-[[-]>>[-]<<]>+>[-<->]<    

जो लोग अभी पढ़ रहे हैं उनके लिए मजेदार तथ्य

यदि इस प्रोग्राम के लिए इनपुट इस प्रोग्राम का सोर्स कोड है, तो यह बार-बार, इस प्रोग्राम को चलाने वाले सेल्फ-इंटरप्रिटर्स को बनाना शुरू कर देगा और फिर उसी प्रोग्राम को फिर से दे देगा। यह मुझे ब्रेनफक में वास्तविक पुनरावर्ती कार्यक्रम बनाने पर कुछ दिलचस्प विचार देता है। वापसी मान की जाँच करने और इस प्रश्न के रूप में एक अनंत लूप शुरू करने के बजाय, वापसी मूल्य को बचाया जा सकता है और उस पर कार्रवाई की जा सकती है। एक सरल उदाहरण एक गुटीय कार्यक्रम होगा जो जाता है

If cell1 == 0:
    Get input into cell1
If cell1 == 1 or cell1 == 0:
    Return 1
Else:
    Initialise self-interpreter-quine function
    Pass cell1-1 into cell1 of the function
    Run function
    Multiply cell1 by the return value
    Return cell1

बेशक, यह ब्रेनफॉक कोडिंग का एक पूरी तरह से पागलपन भरा तरीका है, यह देखते हुए कि स्व-दुभाषियों को दोबारा चलाने से रनटाइम तेजी से बढ़ेगा।


वाह! यदि आप इसे वापस करना चाहते हैं तो BTW, मुझे लगता है कि आप समर्थन छोड़ सकते हैं .। यद्यपि यह अब एक कोड-गोल्फ प्रश्न नहीं है, पूरी भाषा का समर्थन करना अधिक प्रभावशाली हो सकता है।
अर्जन जोहान्सन

@ GolfrjanJohansen, मैं अकेले एक अलग डेटा जनरेशन मेथड पर स्विच करके एक हज़ार या तो बाइट्स को बंद कर सकता हूँ। इसके अलावा, आत्म-व्याख्याकार सबसे छोटा नहीं है जिसे मैं लिख सकता हूं, क्योंकि यह नकारात्मक कोशिकाओं का समर्थन करता है।
जो राजा

ऐसा लग रहा है कि यह इनाम जीतना चाहिए, लेकिन मैं इसे समझने के लिए अपना समय लेना चाहता हूं, खुद बीएफ विशेषज्ञ नहीं। क्या आप मुझे पिंग कर सकते हैं यदि आप अगले सप्ताह कुछ समय नहीं सुनते हैं?
नथानिएल

1
मैं पुष्टि करता हूं कि यह कल्पना से मिलता है, जहां तक ​​मैं बता सकता हूं। एक इनाम को जल्द ही अपनी तरह से पंख लगाना चाहिए। (इससे पहले कि सिस्टम मुझे अवार्ड देगा, देरी हो रही है।) उत्तर के लिए धन्यवाद, यह बहुत सराहना की गई है।
नथानिएल

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