轨道
/
Python
Python
/
练习
/
相对距离
相对距离

相对距离

中等

简介

你受聘开发Noble Knots,专为贵族打造的最热门新交友应用!经过几个世纪的王室通婚,事情变得……_复杂_了。为了避免出现_哎呀,我们是双胞胎_这样的情况,你的任务是构建一个系统,用来检查两个人的血缘有多近。

Noble Knots 的灵感来自冰岛的“Islendinga-App”,它背后有一个数据库,记录了自冰岛定居以来冰岛人之间所有已知的亲缘关系。你的算法将判断王室家谱中两个人之间的亲疏程度。

你的应用能促成一段完美的姻缘吗?

说明

你的任务是确定家谱中两个人之间的分隔度。这类似于流行文化中的那个说法:每位好莱坞演员都与 Kevin Bacon 相隔不超过六度。

  • 输入中会给出所有父母的名字以及他们的子女。
  • 每个名字都是唯一的,一个孩子_可以_有一位或两位父母。
  • 分隔度定义为一个人到另一个人之间的最短连接数。
  • 如果两个人之间没有连接,就返回一个表示“no known relationship.”的值。 具体实现请参见测试用例。

示例

给定下面这棵家谱树:

      ┌──────────┐            ┌──────────┐     ┌───────────┐
      │  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方法的桩。 首先,你需要在__init__中为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,全部免费。