यह स्पष्ट रूप से कार्य के लिए सही भाषा है। : ^ डी
s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$
यदि यह एक वैध साँप है तो पूरे इनपुट से मेल खाता है; यदि यह नहीं है तो मैच में विफल रहता है। यहाँ कोशिश करो!
व्याख्या
SnakeEx एक 2-D पैटर्न से मेल खाने वाली भाषा है । एक कार्यक्रम में "सांप" के लिए परिभाषाओं की एक सूची होती है, जो कि इनपुट मिलान वाले पात्रों के चारों ओर क्रॉल करते हैं, दिशा बदलते हैं, और अन्य सांपों को पैदा करते हैं। हमारे कार्यक्रम में, हम दो सांपों को परिभाषित करते हैं, s
और c
।
हम शुरू करेंगे c
क्योंकि यह सरल है। इसकी परिभाषा है 0 *$
, जो काफी पठनीय होनी चाहिए यदि आप रेगेक्स जानते हैं: मैच 0
, इसके बाद शून्य या अधिक रिक्त स्थान, इसके बाद ग्रिड के किनारे। यहां मुख्य पकड़: यह मिलान किसी भी दिशा में आगे बढ़ सकता है। हम c
साँप से ऊपर और नीचे दोनों का उपयोग करने जा रहे हैं , यह सत्यापित करने के लिए कि 0
प्रत्येक कॉलम में कोई अतिरिक्त s नहीं हैं ।
अभी मुख्य साँप के लिए, s
। यह रूप लेता है (...)%{30}
, जिसका अर्थ है "30 बार कोष्ठक की सामग्री से मेल खाता है" - 0
सांप में प्रत्येक के लिए एक बार । अब तक सब ठीक है। कोष्ठक के अंदर क्या जाता है?
{c<L>}
इसने एक नए c
साँप को जन्म दिया, 90 डिग्री पर छोड़ दिया। दिशा s
साँप की दिशा के सापेक्ष है , इसलिए नया साँप ग्रिड के शीर्ष की ओर बढ़ता है (मुख्य साँप दाईं ओर बढ़ रहा है)। c
साँप की जाँच करता है कि मौजूदा ग्रिड सेल एक है 0
और है कि यह ऊपर हर कोशिका एक जगह नहीं है। यदि यह विफल रहता है, तो पूरा मैच विफल हो जाता है। यदि यह सफल होता है, तो हम जारी रखते हैं
{c<R>}
जो एक ही काम करता है, केवल दाएं मुड़ता है (ग्रिड के नीचे की ओर)।
ध्यान दें कि ये स्पॉन मुख्य साँप में मैच पॉइंटर की स्थिति को प्रभावित नहीं करते हैं। वे रेगेक्स में लुकहैड्स की तरह हैं। (शायद यहाँ हम उन्हें "लुक्सबस" कह सकते हैं?) इसलिए यह सत्यापित करने के बाद कि हम एक ओर इशारा कर रहे हैं 0
और बाकी कॉलम में केवल रिक्त स्थान हैं, हमें वास्तव में मेल खाना चाहिए 0
:
0
अब मैच पॉइंटर दायीं ओर के चरित्र पर है 0
। हमें तीन अलग-अलग विकल्पों की जाँच करने की आवश्यकता है: साँप कोण नीचे, साँप कोण ऊपर, या साँप सीधा जाता है। इसके लिए, हम एक या अभिव्यक्ति का उपयोग कर सकते हैं:
[...]
हमारे OR के अंदर, हमारे पास तीन संभावनाएँ हैं:
(<R> <L>)
दाएं मुड़ें, एक स्थान से मेल खाएं, और बाईं ओर फिर से मुड़ें (साँप कोण नीचे)।
(<L> <R>)
बाएं मुड़ें, एक स्थान से मेल खाएं, और दाहिनी ओर फिर से मुड़ें (साँप कोण ऊपर)।
_?
मैच शून्य या एक अंडरस्कोर। चूंकि इनपुट में कोई अंडरस्कोर नहीं हैं, यह हमेशा एक खाली मैच होगा (सांप सीधे चला जाता है)।
उपरोक्त तीन विकल्पों में से एक के मिलान के बाद, मैच पॉइंटर को 0
अगले कॉलम में इंगित किया जाना चाहिए , कोष्ठक अभिव्यक्ति को फिर से मैच करने के लिए तैयार।