لقد تم تعيينك لتطوير Noble Knots، أحدث تطبيقات المواعدة وأكثرها رواجًا للنبلاء! مع قرون من الزيجات المتداخلة بين العائلات الملكية، أصبحت الأمور… معقدة. لتجنّب أي مواقف من نوع عفوًا، نحن توأمان، فإن مهمتك هي بناء نظام يتحقق من مدى قرابة شخصين.
استُلهم Noble Knots فكرته من تطبيق آيسلندا «Islendinga-App»، الذي تسنده قاعدة بيانات تتعقّب كل صلات القرابة المعروفة بين الآيسلنديين منذ زمن استيطان آيسلندا. وستحدّد خوارزميتك درجة القرابة بين أي شخصين في شجرة العائلة المالكة.
فهل سيساعد تطبيقك في تتويج شريك مثالي؟
مهمتك هي تحديد درجة الانفصال بين شخصين في شجرة عائلة. هذا مشابه لفكرة شائعة في الثقافة الشعبية مفادها أن كل ممثل في هوليوود يقع ضمن ست درجات من كيفن بيكون.
بالنظر إلى شجرة العائلة التالية:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
درجة الانفصال بين Tariq و Uma هي 2 (Tariq → Isla → Uma). لا توجد علاقة معروفة بين Isla و Kevin، إذ لا توجد صلة في البيانات المعطاة. درجة الانفصال بين Uma و Isla هي 1.
Isla و Tariq شقيقان، ودرجة الانفصال بينهما 1. وبالمثل، سيبلغ هذا التنفيذ عن درجة انفصال مقدارها 2 بينك وبين عمّك.
تتوقع اختبارات هذا التمرين أن يكون حلّك منفَّذًا على شكل class باسم RelativeDistance في Python.
وإذا لم تكن معتادًا على استخدام class في Python، فإن classes وclasses في توثيق Python الرسمي نقطتان جيدتان للبدء.
ينبغي تهيئة RelativeDistance (راجع __init__() لمزيد من المعلومات) باستخدام family_tree، وهو قاموس تمثّل فيه keys الأفراد وتمثّل values قوائم من نوع list تضم أبناء ذلك الفرد.
ستحتاج أيضًا إلى تنفيذ طريقة degree_of_separation تُرجع درجة الانفصال بين person_a وperson_b، وهما فردان ضمن شجرة العائلة المُمرَّرة.
لديك تنفيذ هيكلي لـالطريقة الخاصة __init__ المستخدمة في إنشاء نسخة من صنف RelativeDistance، وكذلك هيكل لطريقة degree_of_separation.
أولًا، ستحتاج إلى تخصيص __init__ بسمة مناسبة على self (النسخة) تمثّل بيانات family_tree.
ثم يمكنك إضافة منطقك إلى طريقة degree_of_separation لحساب درجة الانفصال بين person_a وperson_b.
أحيانًا تحتاج إلى رفع استثناء. وعندما تفعل ذلك، ينبغي أن تُرفق دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ. فهذا يجعل الكود أكثر قابلية للقراءة ويساعد كثيرًا في تصحيح الأخطاء. وفي الحالات التي تعرف فيها أن مصدر الخطأ سيكون من نوع معيّن، يمكنك اختيار رفع أحد أنواع الأخطاء المدمجة، مع إرفاق رسالة ذات معنى رغم ذلك.
يتطلب هذا التمرين تحديدًا أن تستخدم عبارة raise من أجل «رمي» عدة ValueError.
في الحالة الأولى، ستحتاج إلى رفع ValueError عندما يكون أحد الشخصين المُمرَّرين إلى طريقة RelativeDistance.degree_of_separation غير موجود في شجرة العائلة، أو كليهما.
# 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.