SGF পার্সিং

SGF পার্সিং

মধ্যম

নির্দেশনা

একটি Smart Game Format স্ট্রিং পার্স করা।

SGF হলো বোর্ড গেমের ফাইল সংরক্ষণের একটি স্ট্যান্ডার্ড ফরম্যাট, বিশেষ করে গো খেলার।

SGF বেশ সরল একটি ফরম্যাট। একটি SGF ফাইলে সাধারণত নোডের একটিমাত্র ট্রি থাকে, যেখানে প্রতিটি নোড একটি প্রপার্টি লিস্ট। প্রপার্টি লিস্টে কী (key)-মান জোড়া থাকে; প্রতিটি কী (key) একবারই আসতে পারে, তবে একাধিক মান থাকতে পারে।

এই অনুশীলনীতে আপনাকে একটি SGF স্ট্রিং পার্স করতে হবে এবং প্রপার্টির একটি ট্রি স্ট্রাকচার রিটার্ন করতে হবে।

একটি SGF ফাইল দেখতে এমন হতে পারে:

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

এটি তিনটি নোডের একটি ট্রি:

  • সর্বোচ্চ স্তরের নোডের তিনটি প্রপার্টি আছে: FF[4] (কী (key) = "FF", মান = "4"), C[root] (কী (key) = "C", মান = "root") এবং SZ[19] (কী (key) = "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 পয়েন্ট, কোণা নেওয়ার একটি খুবই স্ট্যান্ডার্ড ওপেনিং)।

একটি কী (key)-এর সাথে একাধিক মান যুক্ত থাকতে পারে। যেমন:

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

এখানে AB (add black) বোর্ডে তিনটি কালো পাথর যোগ করতে ব্যবহৃত হয়।

সব প্রপার্টির মানই হবে SGF Text টাইপ। আপনাকে আর কোনো মান টাইপ ইমপ্লিমেন্ট করতে হবে না। যদিও আপনি Text টাইপের সম্পূর্ণ ডকুমেন্টেশন পড়তে পারেন, গুরুত্বপূর্ণ বিষয়গুলোর একটি সারসংক্ষেপ নিচে দেওয়া হলো:

  • কোনো নিউলাইন যদি সরাসরি একটি \-এর পরে আসে, তাহলে সেটি মুছে ফেলা হয়; অন্যথায় সেটি নিউলাইন হিসেবেই থাকে।
  • নিউলাইন ছাড়া বাকি সব হোয়াইটস্পেস ক্যারেক্টার স্পেসে রূপান্তর করা হয়।
  • \ হলো এস্কেপ ক্যারেক্টার। \-এর পরে আসা যেকোনো নন-হোয়াইটস্পেস ক্যারেক্টার যেমন আছে তেমনই বসানো হয়। \-এর পরে আসা যেকোনো হোয়াইটস্পেস ক্যারেক্টার উপরের নিয়ম মেনে চলে। মনে রাখবেন, SGF-এ \t বা \n-এর মতো হোয়াইটস্পেস ক্যারেক্টারের জন্য কোনো এস্কেপ সিকোয়েন্স নেই।

এই দুইয়ের মধ্যে গুলিয়ে ফেলবেন না:

  • টেস্টে স্ট্রিং লিটারালে যে স্ট্রিং হিসেবে থাকে
  • SGF পার্সারে যে স্ট্রিং পাস করা হয়

SGF পার্সারে পাস করার আগেই প্রোগ্রামিং ভাষার পার্সার স্ট্রিং লিটারালের এস্কেপ সিকোয়েন্স প্রসেস করে ফেলতে পারে।

SGF-এ (এবং সাধারণভাবে পার্সিংয়ে) আরও কিছু জটিলতা আছে, যেগুলো আপনি বেশিরভাগ ক্ষেত্রেই এড়িয়ে যেতে পারেন। ধরে নেবেন যে ইনপুট UTF-8-এ এনকোড করা, টেস্টে কোনো ক্যারসেট প্রপার্টি থাকবে না, তাই এটা নিয়ে চিন্তা করবেন না। এছাড়াও আপনি ধরে নিতে পারেন যে সব নিউলাইন ইউনিক্স স্টাইলের (\n, টেস্টে কোনো \r বা \r\n থাকবে না), আর টেস্টে প্রপার্টি, নোড ইত্যাদির মাঝে কোনো অপশনাল হোয়াইটস্পেস থাকবে না।

এক্সেপশন মেসেজ

কখনও কখনও এক্সেপশন রেইজ করা প্রয়োজন হয়। এটি করলে এররটির উৎস কী, তা বোঝাতে আপনার সর্বদা একটি অর্থবহ এরর মেসেজ যুক্ত করা উচিত। এতে আপনার কোড আরও পাঠযোগ্য হয় এবং ডিবাগিংয়ে যথেষ্ট সাহায্য মেলে। যেসব পরিস্থিতিতে আপনি জানেন এররটির উৎস একটি নির্দিষ্ট টাইপ হবে, সেখানে আপনি বিল্ট-ইন এরর টাইপগুলোর মধ্যে থেকে একটি রেইজ করতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যুক্ত করা উচিত।

এই নির্দিষ্ট অনুশীলনীতে ইনপুটে সঠিক ডেলিমিটার না থাকলে, ইনপুট আপারকেসে না থাকলে, ইনপুট নোড-সহ কোনো ট্রি তৈরি না করলে, বা ইনপুটে একেবারেই কোনো ট্রি তৈরি না হলে, raise স্টেটমেন্ট ব্যবহার করে একটি ValueError "throw" করতে হবে। টেস্ট পাস করবে কেবল তখনই, যদি আপনি 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।