شما استخدام شدهاید تا 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 خواهر و برادرند و درجهی جداییشان ۱ است. به همین ترتیب، این پیادهسازی درجهی جدایی از شما تا برادر پدرتان را ۲ گزارش میکند.
testهای این تمرین انتظار دارند که راهحل شما در پایتون بهصورت یک class به اسم RelativeDistance پیادهسازی شود.
اگر با classها در پایتون آشنایی ندارید، classes و classes در مستندات رسمی پایتون نقاط خوبی برای شروعاند.
RelativeDistance باید با family_tree مقداردهی اولیه شود (برای اطلاعات بیشتر __init__() را ببینید)، یعنی یک دیکشنری که 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 را محاسبه کنید.
گاهی لازم است یک استثنا پرتاب کنید. وقتی این کار را میکنید، همیشه باید یک پیام خطای معنادار همراه آن بگذارید تا نشان دهد منبع خطا چیست. این کار خوانایی code شما را بیشتر میکند و به debug کمک زیادی میکند. در موقعیتهایی که میدانید منبع خطا نوع مشخصی دارد، میتوانید یکی از انواع خطای داخلی را پرتاب کنید، اما همچنان باید پیام معناداری همراه آن بگذارید.
این تمرین بهطور خاص میخواهد که از دستور 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.")
testها تنها زمانی قبول میشوند که هم نوع exception مورد انتظار را raise کنید و هم پیام مورد انتظار را همراه آن بفرستید.
لطفاً testها و نتایج مورد انتظارشان را با دقت بررسی کنید، چون این دستورالعملها کامل و جامع نیستند.