學習軌道
/
Python
Python
/
練習
/
相對距離
相對距離

相對距離

中等

簡介

你受僱開發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。

Note

Isla 和 Tariq 是手足,兩人之間的分隔度數是 1。 同樣地,這個實作會回報你和父親的兄弟之間的分隔度數是 2。

這個 Python 練習的結構

這個練習的測試預期你的解法要用 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 類型,並附上預期的訊息,測試才會通過。 請仔細檢查測試和它們預期的結果,因為這裡的說明並不完整。


出處

vaeng連結會在新視窗或分頁中開啟
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 相對距離 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。