Befunge, 344 बाइट्स
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
इसे ऑनलाइन आज़माएं!
जैसा कि उनके MATLAB उत्तर में @flawr का उल्लेख किया गया है, यदि फ़ील्ड का आकार किसी भी गैर-तुच्छ आकार का है तो इसमें कुछ समय लग सकता है। वास्तव में यह एक ऐसी स्थिति में पहुंचना काफी आसान है, जहां वास्तव में इसके खत्म होने का इंतजार करने की कोशिश करने लायक नहीं है, क्योंकि आप समय के अंत तक इंतजार करने की काफी संभावना रखते हैं।
ऐसा क्यों होता है, यह समझने के लिए, यह प्रोग्राम को देखने में मददगार है क्योंकि यह बेफुज के कई "विज़ुअल डीबगर्स" में से एक में निष्पादित हो रहा है। चूंकि डेटा और कोड Befunge में समान हैं, इसलिए आपको समय के साथ बदलाव के साथ मार्ग देखने को मिलेगा। उदाहरण के लिए, यहां एक छोटा एनीमेशन दिखाया गया है जिसमें धीमे रास्ते पर चलने वाला भाग कैसा दिख सकता है।
एक बार जब एल्गोरिथ्म क्षेत्र की सीमा के नीचे बाईं ओर उस भाग्यपूर्ण मोड़ को बनाने का फैसला करता है, तो उसने अनिवार्य रूप से लक्ष्यहीन भटकने वाले जीवनकाल की निंदा की है। उस बिंदु से उस क्षेत्र में उस बंद क्षेत्र से पहले हर संभव पथ का अनुसरण करना होगा ताकि वह वापस बाहर आ सके और दाईं ओर मुड़ने का प्रयास कर सके। और इन मामलों में संभावित रास्तों की संख्या आसानी से खगोलीय बन सकती है।
नीचे पंक्ति: यदि यह एक लंबा समय लगता है, तो संभवतः निष्पादन को समाप्त करना और फिर से शुरू करना एक अच्छा विचार है।
व्याख्या
यह मूल रूप से एक पुनरावर्ती एल्गोरिथ्म है, जो क्षेत्र के माध्यम से हर संभव पथ की कोशिश कर रहा है, और फिर कदमों को खोलना है जो पहले से ही पीछा किया गया है जब भी यह अटक जाता है। चूंकि Befunge में फ़ंक्शन की अवधारणा नहीं है, इसलिए एक पुनरावर्ती फ़ंक्शन प्रश्न से बाहर है, लेकिन हम स्टैक पर राज्य को ट्रैक करके प्रक्रिया का अनुकरण कर सकते हैं।
यह स्टैक को संभावित निर्देशांक के साथ आबाद करके काम करता है जिसे हम अनुसरण करना चाहते हैं। फिर हम स्टैक से एक सेट खींचते हैं और जांचते हैं कि क्या यह उपयुक्त है (यानी सीमा में और मौजूदा पथ के साथ अतिव्यापी नहीं)। एक बार जब हमें एक अच्छा स्थान मिल जाता है, तो हम #
उस स्थान पर प्लेफील्ड में लिखते हैं , और उन विवरणों को स्टैक में जोड़ते हैं, जिन्हें हमें बाद में पीछे करने की आवश्यकता होती है।
हम तब स्टैक पर निर्देशांक के एक अतिरिक्त चार सेट को धक्का देते हैं (यादृच्छिक क्रम में) संभावित रास्तों को इंगित करते हुए जो हम इस नए स्थान से ले सकते हैं, और लूप की शुरुआत में वापस कूद सकते हैं। यदि संभावित रास्तों में से कोई भी संभव नहीं है, तो हम उस स्टैक पर बिंदु पर पहुंचेंगे, जहां हमने उसका स्थान बचाया है#
हमने लिखा हुआ है, इसलिए हम उस चरण को पूर्ववत कर देंगे और एक चरण पूर्व से संभावित निर्देशांक आज़माना जारी रखेंगे।
यह वह कोड है जो हाइलाइट किए गए विभिन्न घटक भागों के साथ दिखता है:
क्षेत्र की चौड़ाई और ऊंचाई पढ़ें, और 0
एक बैक मार्कर स्थान के बजाय संभावित मार्ग को इंगित करने के लिए एक प्रकार मार्कर के साथ प्रारंभ निर्देशांक को धक्का दें ।
बैकट्रैकिंग स्थानों (एक 1
प्रकार के मार्कर द्वारा इंगित ) के लिए जांचें जो एक साधारण p
कमांड के साथ वापस किए जाते हैं, क्योंकि वे प्लेफील्ड में वापस स्पेस लिखने के लिए आवश्यक सटीक प्रारूप में संग्रहीत होते हैं।
जांचें कि क्या निर्देशांक अभी भी प्लेफील्ड के अंदर हैं। यदि वे सीमा से बाहर हैं, तो उन्हें अगले संभावित निर्देशांक की कोशिश करने के लिए स्टैक और लूप से छोड़ दें।
यदि वे सीमा में हैं, तो स्टैक से अगले दो मान प्राप्त करें, जो पिछले चरण का स्थान है (इसके बाद होने वाले परीक्षण में आवश्यक)।
जांचें कि क्या निर्देशांक पथ के मौजूदा खंड के संपर्क में आने वाले हैं। पिछले चरण के स्थान को स्पष्ट रूप से इस चेक से अनदेखा किया गया है।
यदि सभी परीक्षण सफल होते हैं, #
तो प्लेफील्ड में लिखें , और जांचें कि क्या हम गंतव्य स्थान पर पहुंच गए हैं।
अगर हमारे पास है, तो अंतिम रास्ता लिखें, और बाहर निकलें।
अन्यथा 1
बाद में बैकट्रैकिंग के लिए एक प्रकार के मार्कर के साथ स्टैक पर निर्देशांक को सहेजें ।
यह एक यादृच्छिक संख्या गणना के साथ बाधित है जिसे हम जल्द ही लेने जा रहे हैं।
चार संभावित गंतव्यों को धक्का दें जो वर्तमान स्थान से पहुंचा जा सकता है। यादृच्छिक संख्या उस क्रम को निर्धारित करती है जिसमें वे धकेल दिए जाते हैं और इस प्रकार वे आदेश का पालन किया जाएगा।
मुख्य लूप की शुरुआत में वापस लपेटें और स्टैक पर अगले मानों को संसाधित करें।