forked from mouredev/roadmap-retos-programacion
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
031eed9
commit a6efa9e
Showing
1 changed file
with
156 additions
and
0 deletions.
There are no files selected for viewing
156 changes: 156 additions & 0 deletions
156
Roadmap/34 - ÁRBOL GENEALÓGICO LA CASA DEL DRAGÓN/python/CesarCarmona30.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
''' | ||
EJERCICIO | ||
''' | ||
|
||
class Person: | ||
|
||
def __init__(self, id: int, name: str) -> None: | ||
self.id = id | ||
self.name = name | ||
self.partner = None | ||
self.children = [] | ||
self.has_parents = False | ||
|
||
def add_partner(self, partner): | ||
if self.partner is not None: | ||
print(f'{self.name} ya tiene una pareja: {self.partner.name}.') | ||
else: | ||
self.partner = partner | ||
partner.partner = self | ||
print(f'{self.name} es pareja de: {partner.name}.') | ||
|
||
def add_child(self, child): | ||
if child not in self.children: | ||
self.children.append(child) | ||
print(f'{self.name} ha tenido un hijo: {child.name}.') | ||
else: | ||
print(f'{child.name} ya es hijo de {self.name}.') | ||
|
||
class FamilyTree: | ||
|
||
def __init__(self): | ||
self.people = {} | ||
|
||
def add_person(self, id, name): | ||
if id in self.people: | ||
print(f"La persona con ID: {id} ya existe.") | ||
else: | ||
person = Person(id, name) | ||
self.people[id] = person | ||
print( | ||
f"La persona con nombre {name} [ID: {id}] ha sido añadida al árbol.") | ||
|
||
def remove_person(self, id): | ||
if id in self.people: | ||
person = self.people[id] | ||
del self.people[id] | ||
print( | ||
f"La persona con nombre {person.name} [ID: {id}] ha sido eliminada del árbol.") | ||
else: | ||
print(f"La persona con ID: {id} no existe en el árbol.") | ||
|
||
def set_partner(self, id1, id2): | ||
if id1 in self.people and id2 in self.people: | ||
person1 = self.people[id1] | ||
person2 = self.people[id2] | ||
person1.add_partner(person2) | ||
else: | ||
print("Algún ID no existe en el árbol.") | ||
|
||
def add_child(self, parent_id, child_id): | ||
if parent_id in self.people and child_id in self.people: | ||
if parent_id == child_id: | ||
print("Los ID no pueden ser iguales a la hora de asignar un hijo.") | ||
else: | ||
parent = self.people[parent_id] | ||
if parent.partner is None: | ||
print(f"Se necesita una pareja para poder tener un hijo.") | ||
else: | ||
child = self.people[child_id] | ||
if child.has_parents: | ||
print( | ||
f"{child.name} [ID: {child.id}] ya tiene padres.") | ||
else: | ||
child.has_parents = True | ||
parent.add_child(child) | ||
parent.partner.add_child(child) | ||
else: | ||
print("Algún ID no existe en el árbol.") | ||
|
||
def print_tree(self): | ||
visited = set() | ||
|
||
def print_person(person, level=0): | ||
|
||
if person.id in visited: | ||
return | ||
|
||
visited.add(person.id) | ||
indent = "\t" * level | ||
|
||
print(f"{indent} ├── {person.name} [ID: {person.id}]") | ||
|
||
if person.partner: | ||
visited.add(person.partner.id) | ||
print( | ||
f"{indent} \t└── Pareja: {person.partner.name} [ID: {person.partner.id}]") | ||
|
||
if person.children: | ||
print(f"{indent} \t└── Hijos:") | ||
for child in person.children: | ||
print_person(child, level + 1) | ||
|
||
for person in self.people.values(): | ||
is_child = person.has_parents | ||
if not is_child: | ||
print_person(person) | ||
|
||
tree = FamilyTree() | ||
|
||
tree.add_person(1, "Jocelyn") | ||
tree.add_person(2, "Aemon") | ||
|
||
tree.set_partner(1, 2) | ||
|
||
tree.add_person(3, "Rhaenys") | ||
|
||
tree.add_child(1, 3) | ||
|
||
tree.add_person(4, "Corlys") | ||
|
||
tree.set_partner(3, 4) | ||
|
||
tree.add_person(5, "Laena") | ||
tree.add_person(6, "Laenor") | ||
|
||
tree.add_child(3, 5) | ||
tree.add_child(3, 6) | ||
|
||
tree.add_person(7, "Baelon") | ||
tree.add_person(8, "Alyssa") | ||
|
||
tree.set_partner(7, 8) | ||
|
||
tree.add_person(9, "Viserys I") | ||
tree.add_person(10, "Daemon") | ||
|
||
tree.add_child(7, 9) | ||
tree.add_child(8, 10) | ||
|
||
tree.add_person(11, "Aemma") | ||
|
||
tree.set_partner(9, 11) | ||
|
||
tree.add_person(12, "Rhaenyra") | ||
|
||
tree.add_child(9, 12) | ||
|
||
tree.set_partner(10, 12) | ||
|
||
tree.add_person(13, "Aegon") | ||
tree.add_person(14, "Viserys") | ||
|
||
tree.add_child(12, 13) | ||
tree.add_child(12, 14) | ||
|
||
tree.print_tree() |