Felvettek, hogy kifejleszd a Noble Knots alkalmazást, a nemesség legmenőbb új társkereső appját! Az évszázadok óta tartó királyi összeházasodások miatt a dolgok… bonyolulttá váltak. Hogy elkerüld a hopp, ikrek vagyunk helyzeteket, az a feladatod, hogy építs egy rendszert, amely ellenőrzi, hogy két ember milyen szoros rokonságban van egymással.
A Noble Knots alkalmazást Izland „Islendinga-App” ihlette, amely mögött egy olyan adatbázis áll, amely az izlandiak közötti összes ismert családi kapcsolatot nyomon követi Izland betelepítésének idejétől kezdve. Az algoritmusod fogja meghatározni az elválasztási fokot két személy között a királyi családfán.
Vajon az appod segít megkoronázni a tökéletes párt?
A feladatod, hogy meghatározd két személy elkülönülési fokát egy családfában. Ez hasonlít ahhoz a popkulturális elképzeléshez, hogy minden hollywoodi színész hat lépésre van Kevin Bacontől.
Adott a következő családfa:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Tariq és Uma között az elkülönülési fok 2 (Tariq → Isla → Uma). Isla és Kevin között nincs ismert kapcsolat, mivel az adott adatokban nincs összeköttetés. Uma és Isla között az elkülönülési fok 1.
Isla és Tariq testvérek, az elkülönülési fokuk 1. Hasonlóképpen ez a megvalósítás 2-es elkülönülési fokot adna meg közötted és az apád fivére között.
A feladat tesztjei elvárják, hogy a megoldásodat Pythonban egy RelativeDistance class-ként valósítsd meg.
Ha még nem ismered a Python class-eket, jó kiindulópont lehet a classes, valamint a Python hivatalos dokumentációjában a classes.
A RelativeDistance-t egy family_tree szótárral kell inicializálni (további információért lásd: __init__()), amelyben a keys a személyek, a values pedig az adott személy gyermekeinek list-jei.
Ezenkívül meg kell valósítanod egy degree_of_separation metódust is, amely visszaadja person_a és person_b rokonsági fokát, akik a kapott családfában szereplő személyek.
A RelativeDistance osztály példányosításához használt __init__ speciális metódushoz kapsz egy vázlatos implementációt, valamint a degree_of_separation metódus vázlatát is.
Először az __init__-et kell testre szabnod egy megfelelő attribútummal a self-en (a példányon), amely a family_tree adatait képviseli.
Ezután hozzáadhatod a logikádat a degree_of_separation metódushoz, hogy kiszámítsd person_a és person_b rokonsági fokát.
Néha szükség van arra, hogy kivételt dobj. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely megmutatja, mi a hiba forrása. Ez olvashatóbbá teszi a kódot, és jelentősen megkönnyíti a hibakeresést. Ha tudod, hogy a hiba forrása egy bizonyos típusú lesz, dönthetsz úgy, hogy a beépített hibatípusok egyikét dobod, de ilyenkor is adj meg beszédes üzenetet.
Ebben a feladatban a raise utasítást kell használnod ahhoz, hogy több ValueError-t „dobj”.
Az első esetben ValueError-t kell dobnod, ha a RelativeDistance.degree_of_separation metódusnak átadott személyek közül az egyik vagy mindkettő nem szerepel a családfában.
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
Ha mindkét személy szerepel a családfában, akkor ValueError-t kell dobnod, ha a szabályok szerint nincs érvényes kapcsolat közöttük.
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
A tesztek csak akkor futnak át, ha a várt exception típust raise-eled, és mellé a várt üzenetet is odaírod.
Nézd át figyelmesen a teszteket és a várt eredményeiket, mert ez az útmutató nem teljes körű.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.