Tracks
/
Python
Python
/
Ejercicios
/
Distancia relativa
Distancia relativa

Distancia relativa

Intermedia

Introducción

¡Te contrataron para desarrollar Noble Knots, la nueva app de citas para la nobleza más popular del momento! Tras siglos de matrimonios entre la realeza, las cosas se han vuelto… complicadas. Para evitar cualquier situación del tipo ups, somos gemelos, tu trabajo es construir un sistema que compruebe qué tan emparentadas están dos personas.

Noble Knots está inspirada en la «Islendinga-App» de Islandia, que se apoya en una base de datos que rastrea todos los vínculos familiares conocidos entre islandeses desde la época del asentamiento de Islandia. Tu algoritmo determinará el grado de separación entre dos personas en el árbol genealógico de la familia real.

¿Ayudará tu app a coronar una pareja perfecta?

Instrucciones

Tu tarea es determinar el grado de separación entre dos personas en un árbol genealógico. Esto es parecido a la idea de la cultura popular de que todo actor de Hollywood está a seis grados o menos de Kevin Bacon.

  • Recibirás un argumento con todos los nombres de los padres y sus hijos.
  • Cada nombre es único y un hijo puede tener uno o dos padres.
  • El grado de separación se define como el menor número de conexiones entre una persona y otra.
  • Si dos personas no están conectadas, devuelve un valor que represente «no known relationship». Consulta los casos de prueba para ver la implementación concreta.

Ejemplo

Dado el siguiente árbol genealógico:

      ┌──────────┐            ┌──────────┐     ┌───────────┐
      │  Helena  │            │  Erdős   ├─────┤  Shusaku  │
      └───┬───┬──┘            └─────┬────┘     └────┬──────┘
      ┌───┘   └───────┐             └───────┬───────┘
┌─────┴────┐     ┌────┴───┐           ┌─────┴────┐
│   Isla   ├─────┤ Tariq  │           │   Kevin  │
└────┬─────┘     └────┬───┘           └──────────┘
     │                │
┌────┴────┐      ┌────┴───┐
│   Uma   │      │ Morphy │
└─────────┘      └────────┘

El grado de separación entre Tariq y Uma es 2 (Tariq → Isla → Uma). No hay ninguna relación conocida entre Isla y Kevin, ya que no hay conexión en los datos proporcionados. El grado de separación entre Uma e Isla es 1.

Note

Isla y Tariq son hermanos y tienen una separación de 1. De forma similar, esta implementación reportaría una separación de 2 de ti al hermano de tu padre.

Cómo está estructurado este ejercicio para la ruta de Python

Las pruebas de este ejercicio esperan que tu solución se implemente en Python como una class RelativeDistance. Si no conoces las classes en Python, classes y classes en la documentación oficial de Python son buenos puntos de partida.

RelativeDistance debe inicializarse (consulta __init__() para más información) usando family_tree, un diccionario donde las keys son personas y los values son lists de los hijos de esa persona. También tendrás que implementar un método degree_of_separation que devolverá el grado de separación entre person_a y person_b, que son personas en el árbol genealógico que se pasa.

Se te da una implementación de esqueleto para el método especial __init__ que se usa para crear una instancia de la clase RelativeDistance, así como un esqueleto del método degree_of_separation. Primero, tendrás que personalizar el __init__ con un atributo apropiado en self (la instancia) para representar los datos de family_tree. Después puedes agregar tu lógica al método degree_of_separation para calcular el grado de separación entre person_a y person_b.

Mensajes de excepción

A veces es necesario lanzar una excepción. Cuando lo hagas, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho con la depuración. En los casos en los que sabes que el origen del error será de cierto tipo, puedes optar por lanzar uno de los tipos de error incorporados, pero aun así debes incluir un mensaje significativo.

Este ejercicio en particular requiere que uses la sentencia raise para «lanzar» varios ValueErrors. En el primer escenario, tendrás que lanzar un ValueError cuando alguna de las dos personas que se pasan al método RelativeDistance.degree_of_separation, o ambas, no estén presentes en el árbol genealógico.

# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")

Si ambas personas están presentes en el árbol genealógico, tendrás que lanzar un ValueError cuando no haya una conexión válida entre ellas según lo que definen las reglas.

# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")

Las pruebas solo pasarán si lanzas con raise el tipo de exception esperado e incluyes el mensaje esperado junto con él. Revisa con cuidado las pruebas y sus resultados esperados, ya que estas instrucciones no son exhaustivas.


Fuente

vaengEl enlace se abre en una ventana o pestaña nueva
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Python Exercism

¿Todo listo para empezar Distancia relativa?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.