ट्रैक
/
Python
Python
/
अभ्यास
/
SGF पार्सिंग
SGF पार्सिंग

SGF पार्सिंग

मध्यम

निर्देश

Smart Game Format स्ट्रिंग को पार्स करना।

SGF बोर्ड गेम की फाइलें, खासकर गो की, संग्रहीत करने का एक मानक फॉर्मेट है।

SGF काफी आसान फॉर्मेट है। एक SGF फाइल में आम तौर पर नोड्स का एक ही ट्री होता है, जिसमें हर नोड एक प्रॉपर्टी ऐरे होता है। प्रॉपर्टी ऐरे में की-वैल्यू जोड़े होते हैं; हर की केवल एक ही बार आ सकती है, लेकिन उसकी कई वैल्यू हो सकती हैं।

इस अभ्यास में आपको एक SGF स्ट्रिंग पार्स करनी है और प्रॉपर्टियों की एक ट्री संरचना लौटानी है।

एक SGF फाइल कुछ ऐसी दिख सकती है:

(;FF[4]C[root]SZ[19];B[aa];W[ab])

यह तीन नोड्स वाला एक ट्री है:

  • सबसे ऊपर के स्तर के नोड में तीन प्रॉपर्टी होती हैं: FF[4] (की = "FF", वैल्यू = "4"), C[root] (की = "C", वैल्यू = "root") और SZ[19] (की = "SZ", वैल्यू = "19")। (FF, SGF का वर्शन बताता है, C एक कमेंट है और SZ बोर्ड का साइज़ है।)
    • सबसे ऊपर के स्तर के नोड का एक ही चाइल्ड है, जिसमें एक ही प्रॉपर्टी है: B[aa]। (काला उस पॉइंट पर खेलता है जो "aa" के रूप में एनकोड किया गया है, और जो 1-1 पॉइंट है।)
      • B[aa] नोड का एक ही चाइल्ड है, जिसमें एक ही प्रॉपर्टी है: W[ab]।

जैसा कि आप सोच सकते हैं, एक SGF फाइल में ऐसे बहुत सारे नोड होते हैं जिनका एक ही चाइल्ड होता है, इसलिए इसके लिए एक संक्षिप्त रूप मौजूद है।

SGF खेल की भिन्नताएँ एनकोड कर सकता है। गो खिलाड़ी अपनी समीक्षाओं में बहुत बार पीछे लौटकर सोचते हैं (चलिए यह आज़माते हैं, काम नहीं करता, चलिए वह आज़माते हैं) और SGF खेल के क्रमों की भिन्नताओं का समर्थन करता है। जैसे:

(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))

यहाँ रूट नोड की दो भिन्नताएँ हैं। पहली (जो परंपरा के अनुसार बताती है कि वास्तव में क्या खेला गया) वह है जहाँ काला 1-1 पर खेलता है। यह फाइल काला को उसके शिक्षक ने भेजी थी, जिसने रूट नोड के दूसरे चाइल्ड में एक ज़्यादा समझदार चाल की ओर ध्यान दिलाया: B[dd] (4-4 पॉइंट, कोना लेने की एक बहुत ही मानक शुरुआत)।

एक की के साथ कई वैल्यू जुड़ी हो सकती हैं। जैसे:

(;FF[4];AB[aa][ab][ba])

यहाँ AB (काला जोड़ना) का इस्तेमाल बोर्ड पर तीन काले पत्थर जोड़ने के लिए किया गया है।

सभी प्रॉपर्टी वैल्यू SGF Text टाइप की होंगी। आपको कोई और वैल्यू टाइप लागू करने की ज़रूरत नहीं है। हालाँकि आप Text टाइप का पूरा दस्तावेज़ पढ़ सकते हैं, फिर भी ज़रूरी बातों का सारांश नीचे दिया गया है:

  • अगर नई लाइनें किसी \ के ठीक बाद आती हैं तो हटा दी जाती हैं, वरना वे नई लाइनों के रूप में बनी रहती हैं।
  • नई लाइन के अलावा बाकी सभी व्हाइटस्पेस अक्षर स्पेस में बदल दिए जाते हैं।
  • \ एस्केप अक्षर है। \ के बाद आने वाला कोई भी गैर-व्हाइटस्पेस अक्षर जैसा है वैसा ही जोड़ दिया जाता है। \ के बाद आने वाला कोई भी व्हाइटस्पेस अक्षर ऊपर बताए गए नियमों का पालन करता है। ध्यान दीजिए कि SGF में \t या \n जैसे व्हाइटस्पेस अक्षरों के लिए एस्केप सीक्वेंस नहीं होते।

इन दोनों में उलझने से बचिए:

  • टेस्ट में स्ट्रिंग लिटरल के रूप में दिखाई जाने वाली स्ट्रिंग
  • वह स्ट्रिंग जो SGF पार्सर को दी जाती है

SGF पार्सर को दिए जाने से पहले स्ट्रिंग लिटरल में मौजूद एस्केप सीक्वेंस प्रोग्रामिंग भाषा के पार्सर द्वारा शायद पहले ही संसाधित किए जा चुके हों।

SGF (और सामान्य रूप से पार्सिंग) में कुछ और जटिलताएँ भी हैं, जिन्हें आप ज़्यादातर नज़रअंदाज़ कर सकते हैं। आपको मान लेना चाहिए कि इनपुट UTF-8 में एनकोड है। टेस्ट में चारसेट प्रॉपर्टी नहीं होगी, इसलिए उसकी चिंता करने की ज़रूरत नहीं है। इसके अलावा आप यह मान सकते हैं कि सभी नई लाइनें यूनिक्स शैली की होंगी (\n, टेस्ट में कोई \r या \r\n नहीं होगा) और यह कि प्रॉपर्टियों, नोड्स आदि के बीच कोई वैकल्पिक व्हाइटस्पेस टेस्ट में नहीं होगा।

एक्सेप्शन संदेश

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

इस अभ्यास में ज़रूरी है कि अगर इनपुट में सही डेलिमिटर नहीं हैं, वह बड़े अक्षरों में नहीं है, वह नोड वाला ट्री नहीं बनाता, या ट्री बिल्कुल नहीं बनाता, तो आप raise स्टेटमेंट का उपयोग करके ValueError "फेंकें"। टेस्ट तभी पास होंगे, जब आप exception को raise भी करें और उसके साथ एक संदेश भी शामिल करें।

किसी संदेश के साथ ValueError उठाने के लिए, उस संदेश को exception टाइप के एक आर्गुमेंट के रूप में लिखिए:

# if the tree properties as given do not have proper delimiters.
raise ValueError("properties without delimiter")

# if the tree properties as given are not all in uppercase.
raise ValueError("property must be in uppercase")

# if the input does not form a tree, or is empty.
raise ValueError("tree missing")

# if the input is a tree without any nodes.
raise ValueError("tree with no nodes")
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Python Exercism

SGF पार्सिंग शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।