सामान्य मार्कोव एल्गोरिदम का उपयोग करते हुए ब्रेनफैक दुभाषिया

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



ऐसे विचार का जन्म कैसे हुआ


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

बुनियादी अवधारणाओं से परिचित होने के लिए, आप पढ़ सकते हैं:

brainfuck;

पुनरावर्ती कार्य;

सामान्य मार्कोव एल्गोरिथ्म।



वास्तव में ब्रेनफैक पूरा करें


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

और इसलिए, क्या लागू किया गया है:

ब्रेनफक टीम

टीम का वर्णन

लागू किया?

>

अगली सेल में जाएं

इसे लागू किया जाता है।

<

पिछले सेल पर जाएं

इसे लागू किया जाता है।

+

वर्तमान सेल में 1 से मान बढ़ाएं

इसे लागू किया जाता है।

-

वर्तमान सेल में मूल्य 1 से घटाएं

इसे लागू किया जाता है।



वर्तमान सेल से प्रिंट मूल्य

इसे लागू किया जाता है।



बाहर से मूल्य दर्ज करें और वर्तमान सेल में सहेजें

लागू नहीं किया गया है, इसलिए यह ऑपरेशन मार्कोव एल्गोरिदम के दृष्टिकोण से विशेष रुचि नहीं है

[

यदि वर्तमान सेल का मान शून्य है, तो आगे बढ़ें

एक के बाद एक सेल के लिए कार्यक्रम पाठ] (खाते में ले रहा है

नेस्टिंग)

इसे लागू किया जाता है।

]

यदि वर्तमान सेल का मान शून्य नहीं है, तो वापस जाएं

प्रतीक के लिए कार्यक्रम पाठ [(घोंसले के शिकार सहित)

इसे लागू किया जाता है।





सामान्य मार्कोव एल्गोरिदम पर दुभाषिया के कार्यान्वयन के लिए क्या आवश्यक है: एक पंक्ति जिसमें हम मस्तिष्क-तरंग ("," ऑपरेटर) के बिना कोड दर्ज करेंगे, एक पंक्ति जो मेमोरी टेप के रूप में कार्य करती है, एक बफर लाइन (परिणाम प्रदर्शित करने के लिए), परिणाम प्रदर्शित करने के लिए एक पंक्ति।



जब दुभाषिया काम करना शुरू करता है, तो स्ट्रिंग-स्ट्रिंग को दिखना चाहिए

._ ... ...

अंकों की संख्या उपलब्ध मेमोरी कोशिकाओं की संख्या है, प्रतीक _ वर्तमान सेल का एक संकेतक है।

मार्कोव एल्गोरिथ्म उत्पादों को एक ही लंबाई के तारों के दो सरणियों के रूप में परिभाषित किया जाएगा: पहला उत्पादों के बाएं हिस्से है, दूसरा दायां है। यदि उत्पाद का दायां भाग फिन में समाप्त होता है, तो इसका मतलब है कि यह उत्पाद अंतिम होगा।

शुरू करने के लिए, मार्कोव एल्गोरिदम के साथ ब्रेनफैक के संचालन को लागू करना सरल है।



ब्रेनफक टीम

मार्कोव एल्गोरिथ्म द्वारा कार्यान्वयन

>

रिबन लाइन में:

string[] left = new string[5] { "|_.", "@_|", "@_.", "_..", "_.|" };

string[] right = new string[5] { "|.@_", "|@_", "_.FIN", "._.FIN", ".@_" };







<

रिबन लाइन में:

string[] left = new string[2] { "|_", "._" };

string[] right = new string[2] { "_|", "_.FIN" };







+

रिबन लाइन में:

string[] left = new string[1] { "_"};

string[] right = new string[1] { "|_FIN"};






-

रिबन लाइन में:

string[] left = new string[1] { "|_" };

string[] right = new string[1] { "_FIN" };









बफर लाइन में:

| > .a

a. >.a

.. >.

.aaaaaaaaaa > a,.

,a > a,

.aaaaaaaaa > 9

.aaaaaaaa > 8

.aaaaaaa > 7

.aaaaaa > 6

.aaaaa >5

.aaaa > 4

.aaa > 3

.aa > 2

.a > 1

. > 0

, >

a > .a

OUT

1>0

2>0

3>0

4>0

5>0

6>0

7>0

8>0

9>0

00>0









[

स्रोत पंक्ति में (खाते के घोंसले में [] लेता है)

string[] left = new string[10] { "_+", "_-", "_.", "_,", "_<", "_>","_[","_]","**","]*" };

string[] right = new string[10] { "+_", "-_", "._", ",_", "<_", ">_","[__","]*","_","]_FIN" };







]

स्रोत पंक्ति में (खाते के घोंसले में [] लेता है)

string[] left = new string[11] { "+_", "-_", "._", ",_", "<_", ">_", "]_", "[_", "*_","[**", "[*" };

string[] right = new string[11] { "_+", "_-", "_.", "_,", "_<", "_>", "__]", "[*","**", "_[", "_[FIN" };









खैर, अब उचित सामान्य दुभाषिया एल्गोरिदम। यह स्रोत लाइन पर किया जाता है, प्रत्येक उत्पादन के बाद ऑपरेशन तालिका से एक उप-एल्गोरिदम कहा जाता है (ऊपर देखें)।



क्या बदला जाए क्या बदला जाए जिसे सब-एल्गोरिथम कहा जाता है
_ + + _ +
_- -_ -
_ [ [_ [
_> > _ >
_ < <_ <
_] यदि आप एक रिबन लाइन पर उत्पाद चला सकते हैं

._। on ._ तब फ़ाइनल करें

] _

अन्यथा सब-एल्गोरिथम कॉल]

]
_। ._


आपके पास एक बार में पूरे कार्यक्रम को निष्पादित करने या इसे चरण दर चरण निष्पादित करने का अवसर है। C # में कार्यान्वयन, इसलिए इसे काम करने के लिए, आपको .NET 2.0 स्थापित करना होगा।

क्लासिक हैलो वर्ल्ड का प्रदर्शन कार्य! इस दुभाषिया पर Brainfuck पर।

छवि



पीएस मुझे उम्मीद है कि यह किसी के लिए कम से कम दिलचस्प था। मैंने पाठ की सबसे छोटी संभव मात्रा के भीतर रखने की कोशिश की।

दुभाषिया का कार्यान्वयन। आप काम में इस राक्षस की कोशिश कर सकते हैं।



All Articles