你受僱開發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 之間的分隔度,這兩人是傳入的家族樹中的個人。
我們提供了 __init__ 特殊方法的雛形實作,用來建立 RelativeDistance 類別的實例,另外也提供了 degree_of_separation 方法的雛形。
首先,你要在 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 類型,並附上預期的訊息,測試才會通過。
請仔細檢查測試和它們預期的結果,因為這裡的說明並不完整。