आपको कुलीनों के लिए बने सबसे चर्चित नए डेटिंग ऐप Noble Knots को बनाने का काम मिला है! शाही परिवारों में सदियों से होते आए आपसी विवाहों की वजह से मामला उलझ गया है। अरे, हम तो जुड़वाँ निकले जैसी किसी भी स्थिति से बचने के लिए आपको एक ऐसा सिस्टम बनाना है जो जाँचता है कि दो लोग कितने करीबी रिश्तेदार हैं।
Noble Knots आइसलैंड के "Islendinga-App" से प्रेरित है, जिसके पीछे एक डेटाबेस है जो आइसलैंड में बसावट के समय से आइसलैंडवासियों के बीच के सभी ज्ञात पारिवारिक संबंधों का पता लगाता है। आपका एल्गोरिदम शाही वंशावली में दो व्यक्तियों के बीच रिश्तेदारी की दूरी तय करेगा।
तो क्या आपका ऐप एक बेहतरीन जोड़ी चुन पाएगा?
आपको एक वंश वृक्ष में दो व्यक्तियों के बीच अलगाव की डिग्री पता लगानी है। यह उस पॉप कल्चर विचार के समान है कि हर हॉलीवुड अभिनेता Kevin Bacon की छह डिग्री के भीतर होता है।
निम्नलिखित वंश वृक्ष दिया गया है:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Tariq और Uma के बीच अलगाव की डिग्री 2 है (Tariq → Isla → Uma)। Isla और Kevin के बीच कोई ज्ञात संबंध नहीं है, क्योंकि दिए गए डेटा में कोई कनेक्शन नहीं है। Uma और Isla के बीच अलगाव की डिग्री 1 है।
Isla और Tariq सगे भाई-बहन हैं और उनके बीच अलगाव 1 है। इसी तरह, यह इम्प्लीमेंटेशन आपसे आपके पिता के भाई तक अलगाव 2 रिपोर्ट करेगा।
इस अभ्यास के टेस्ट चाहते हैं कि आपका हल Python में एक RelativeDistance class के रूप में लिखा जाए।
अगर आप Python में class से परिचित नहीं हैं, तो classes और आधिकारिक Python डॉक्युमेंटेशन में classes से शुरुआत करना अच्छा रहेगा।
RelativeDistance को family_tree की मदद से इनिशियलाइज़ करना चाहिए (ज़्यादा जानकारी के लिए __init__() देखिए)। family_tree एक डिक्शनरी है जिसमें keys अलग-अलग व्यक्ति होते हैं और values उस व्यक्ति के बच्चों की list होती हैं।
आपको एक degree_of_separation मेथड भी बनाना होगा, जो पास की गई फैमिली ट्री में मौजूद person_a और person_b के बीच का डिग्री ऑफ सेपरेशन लौटाएगा।
आपको RelativeDistance क्लास का इंस्टेंस बनाने वाले __init__ स्पेशल मेथड का स्टब दिया गया है, और degree_of_separation मेथड का भी।
सबसे पहले आपको __init__ को इस तरह बदलना होगा कि वह self (यानी इंस्टेंस) पर family_tree डेटा दर्शाने वाला एक उपयुक्त एट्रिब्यूट बना दे।
इसके बाद आप degree_of_separation मेथड में अपना लॉजिक जोड़कर person_a और person_b के बीच का डिग्री ऑफ सेपरेशन निकाल सकते हैं।
कभी-कभी एक्सेप्शन उठाना ज़रूरी हो जाता है। ऐसा करते समय आपको हमेशा एक अर्थपूर्ण एरर मैसेज देना चाहिए, जो बताए कि एरर का स्रोत क्या है। इससे आपका कोड पढ़ने में आसान हो जाता है और डीबग करने में बहुत मदद मिलती है। जिन स्थितियों में आप जानते हैं कि एरर का स्रोत किसी खास टाइप का होगा, वहाँ आप बिल्ट-इन एरर टाइप्स में से कोई एक चुनकर उठा सकते हैं, लेकिन तब भी एक अर्थपूर्ण मैसेज ज़रूर देना चाहिए।
इस अभ्यास में आपको raise स्टेटमेंट का इस्तेमाल करके कई ValueError उठाने होते हैं।
पहली स्थिति में, जब RelativeDistance.degree_of_separation मेथड को दिए गए लोगों में से कोई एक या दोनों फैमिली ट्री में मौजूद न हों, तब आपको एक ValueError उठाना होगा।
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
अगर दोनों लोग फैमिली ट्री में मौजूद हैं, तो जब नियमों के मुताबिक उनके बीच कोई मान्य संबंध न हो, तब आपको एक ValueError उठाना होगा।
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
टेस्ट तभी पास होंगे जब आप raise से अपेक्षित exception टाइप उठाएँगे और उसके साथ अपेक्षित मैसेज भी देंगे।
कृपया टेस्ट और उनके अपेक्षित नतीजे ध्यान से देखिए, क्योंकि ये निर्देश हर चीज़ को नहीं समेटते।
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।