Skip to content

Instantly share code, notes, and snippets.

@Tishka17
Last active February 15, 2023 16:06
Show Gist options
  • Save Tishka17/65316a90f5d74274a27d8fa530879ccd to your computer and use it in GitHub Desktop.
Save Tishka17/65316a90f5d74274a27d8fa530879ccd to your computer and use it in GitHub Desktop.
Count descendants
class Cls:
def __init__(self, name, parents):
self.name = name
self.parents = parents
self.children = []
self.descendents = set()
def attach_parents(self, tree):
for parent in self.parents:
tree[parent].children.append(self)
def dive(self) -> set:
if self.descendents:
return self.descendents
self.descendents = {self}
for child in self.children:
self.descendents.update(child.dive())
return self.descendents
def task(definitions):
tree = {}
for definition in definitions:
cls = Cls(
name=definition["name"],
parents=definition["parents"]
)
tree[cls.name] = cls
for cls in tree.values():
cls.attach_parents(tree)
for root in tree.values():
root.dive()
for name, cls in sorted(tree.items()):
print(name, len(cls.descendents))
task([
{"name": "A", "parents": []},
{"name": "B", "parents": ["A", "C"]},
{"name": "C", "parents": ["A"]}
])
print()
task([
{"name": "B", "parents": ["A", "C"]},
{"name": "C", "parents": ["A"]},
{"name": "A", "parents": []},
{"name": "D", "parents": ["C", "F"]},
{"name": "E", "parents": ["D"]},
{"name": "F", "parents": []},
])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment