আপনাকে Noble Knots তৈরি করার জন্য নিয়োগ দেওয়া হয়েছে, যা অভিজাতদের জন্য সবচেয়ে জনপ্রিয় নতুন ডেটিং অ্যাপ!
শতাব্দীর পর শতাব্দীর রাজকীয় আত্মীয়-বিবাহের ফলে ব্যাপারটা হয়ে উঠেছে… জটিল। যেকোনো উফ-আমরা-ত-যমজ পরিস্থিতি এড়াতে, আপনার কাজ হলো এমন একটি সিস্টেম তৈরি করা, যা যাচাই করে দুজন মানুষ কতটা ঘনিষ্ঠভাবে সম্পর্কিত।
Noble Knots অনুপ্রাণিত হয়েছে আইসল্যান্ডের "Islendinga-App" থেকে, যার পাশে রয়েছে একটি ডেটাবেস, যা আইসল্যান্ডে বসতি স্থাপনের সময় থেকে আইসল্যান্ডীয়দের মধ্যে সব জানা পারিবারিক সম্পর্কের সন্ধান দেয়। আপনার অ্যালগরিদম রাজপরিবারের বংশতালিকায় দুই ব্যক্তির মধ্যে ডিগ্রি অফ সেপারেশন নির্ণয় করবে।
আপনার অ্যাপ কি নিখুঁত জুটিকে মুকুট পরাতে সাহায্য করবে?
আপনার কাজ হলো একটি পারিবারিক বৃক্ষে দুই ব্যক্তির মধ্যে সম্পর্কের মাত্রা নির্ণয় করা। এটি পপ সংস্কৃতির সেই ধারণার মতো, যেখানে বলা হয় প্রত্যেক হলিউড অভিনেতা কেভিন বেকনের ছয় ধাপের মধ্যে থাকেন।
নিচের পারিবারিক বৃক্ষটি ধরুন:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Tariq ও Uma-এর মধ্যে সম্পর্কের মাত্রা ২ (Tariq → Isla → Uma)। Isla ও Kevin-এর মধ্যে কোনো পরিচিত সম্পর্ক নেই, কারণ প্রদত্ত তথ্যে কোনো সংযোগ নেই। Uma ও Isla-এর মধ্যে সম্পর্কের মাত্রা ১।
Isla ও Tariq ভাইবোন, তাদের সম্পর্কের মাত্রা ১। একইভাবে, এই বাস্তবায়ন আপনার থেকে আপনার বাবার ভাইয়ের মধ্যে সম্পর্কের মাত্রা ২ রিপোর্ট করবে।
এই অনুশীলনীর টেস্টগুলো আশা করে যে আপনার সমাধানটি Python-এ একটি RelativeDistance class হিসেবে ইমপ্লিমেন্ট করা হবে।
Python-এ class সম্পর্কে আপনার ধারণা না থাকলে, classes এবং অফিসিয়াল Python ডকুমেন্টেশনে classes শুরু করার ভালো জায়গা।
RelativeDistance-কে family_tree দিয়ে ইনিশিয়ালাইজ করতে হবে (বিস্তারিত জানতে __init__() দেখুন), যা একটি ডিকশনারি, যেখানে keys হলো ব্যক্তিরা আর values হলো সেই ব্যক্তির সন্তানদের list।
আপনাকে আরও একটি degree_of_separation মেথড ইমপ্লিমেন্ট করতে হবে, যা পাস করা ফ্যামিলি ট্রিতে থাকা person_a ও person_b ব্যক্তিদ্বয়ের মধ্যে ডিগ্রি অব সেপারেশন রিটার্ন করবে।
RelativeDistance ক্লাসের একটি ইনস্ট্যান্স তৈরি করে যে __init__ স্পেশাল মেথড, তার একটি স্টাব করা ইমপ্লিমেন্টেশন আপনাকে দেওয়া হয়েছে, আর আছে degree_of_separation মেথডের একটি স্টাবও।
প্রথমে, family_tree ডেটা উপস্থাপন করার জন্য আপনাকে self (ইনস্ট্যান্সটি) -এ একটি উপযুক্ত অ্যাট্রিবিউট দিয়ে __init__ কাস্টমাইজ করতে হবে।
এরপর degree_of_separation মেথডে আপনার লজিক যোগ করে person_a ও person_b ব্যক্তিদ্বয়ের মধ্যে ডিগ্রি অব সেপারেশন হিসাব করতে পারেন।
কখনও কখনও একটি এক্সেপশন raise করা প্রয়োজন হয়।
এমন করলে আপনাকে সর্বদা একটি অর্থবহ এরর মেসেজ যোগ করতে হবে, যা এররের উৎস কী তা বোঝায়।
এটি আপনার কোডকে আরও পাঠযোগ্য করে তোলে এবং ডিবাগিংয়ে অনেক সাহায্য করে।
যেসব ক্ষেত্রে আপনি জানেন যে এররের উৎস একটি নির্দিষ্ট টাইপ হবে, সেখানে আপনি বিল্ট-ইন এরর টাইপ থেকে একটি raise করার সিদ্ধান্ত নিতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যোগ করা উচিত।
এই নির্দিষ্ট অনুশীলনীতে আপনাকে একাধিক ValueError "থ্রো" করতে raise স্টেটমেন্ট ব্যবহার করতে হবে।
প্রথম পরিস্থিতিতে, RelativeDistance.degree_of_separation মেথডে পাস করা দুই ব্যক্তির একজন বা দুজনেই যদি ফ্যামিলি ট্রিতে উপস্থিত না থাকে, তখন আপনাকে একটি ValueError raise করতে হবে।
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
দুই ব্যক্তিই যদি ফ্যামিলি ট্রিতে উপস্থিত থাকে, তাহলে নিয়ম অনুযায়ী তাদের মধ্যে কোনো বৈধ সংযোগ না থাকলে আপনাকে একটি ValueError raise করতে হবে।
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
টেস্ট পাস হবে কেবল তখনই, যদি আপনি প্রত্যাশিত exception টাইপ raise করেন এবং তার সাথে প্রত্যাশিত মেসেজটিও দেন।
অনুগ্রহ করে টেস্টগুলো এবং তাদের প্রত্যাশিত ফলাফল ভালো করে দেখুন, কারণ এই নির্দেশনাগুলো সম্পূর্ণ নয়।
Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।