ट्रैक
/
Haskell
Haskell
/
अभ्यास
/
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 नहीं होगा) और यह कि प्रॉपर्टियों, नोड्स आदि के बीच कोई वैकल्पिक व्हाइटस्पेस टेस्ट में नहीं होगा।

संकेत

Sgf मॉड्यूल को निम्नलिखित सिग्नेचर वाला parseSgf मॉड्यूल एक्सपोर्ट करना चाहिए:

parseSgf :: Text -> Maybe (Tree (Map Text [Text]))

SgfTree और SgfNode की ये परिभाषाएँ कॉपी करना आपके काम आ सकता है:

-- | A tree of nodes.
type SgfTree = Tree SgfNode

-- | A node is a property list, each key can only occur once.
-- Keys may have multiple values associated with them.
type SgfNode = Map Text [Text]

parsec लाइब्रेरी Haskell Platform का हिस्सा है। इसका भरपूर फायदा उठाइए।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Haskell Exercism

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

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