|
1
|
|
|
def merge_members(group, member_a, member_b): |
|
2
|
|
|
first_member = second_member = None |
|
3
|
|
|
for i in group: |
|
4
|
|
|
if member_a in i: |
|
5
|
|
|
first_member = i |
|
6
|
|
|
if member_b in i: |
|
7
|
|
|
second_member = i |
|
8
|
|
|
if first_member and second_member: |
|
9
|
|
|
try: |
|
10
|
|
|
group.remove(first_member) |
|
11
|
|
|
group.remove(second_member) |
|
12
|
|
|
except ValueError: |
|
13
|
|
|
pass |
|
14
|
|
|
group.append(list(set(first_member + second_member))) |
|
15
|
|
|
return sorted(group, key=lambda x: len(x), reverse=True) |
|
16
|
|
|
else: |
|
17
|
|
|
return group |
|
18
|
|
|
|
|
19
|
|
|
|
|
20
|
|
|
def is_family(tree): |
|
21
|
|
|
all_members = {j: {'father': None, 'son': []} for i in tree for j in i} |
|
22
|
|
|
member_group = [[i] for i in all_members.keys()] |
|
23
|
|
|
|
|
24
|
|
|
for relation in tree: |
|
25
|
|
|
# he is his father and son |
|
26
|
|
|
if len(set(relation)) == 1: |
|
27
|
|
|
return False |
|
28
|
|
|
# someone's father and son are the same person |
|
29
|
|
|
if relation[1] != all_members[relation[0]]['father']: |
|
30
|
|
|
all_members[relation[0]]['son'].append(relation[1]) |
|
31
|
|
|
else: |
|
32
|
|
|
return False |
|
33
|
|
|
# someone has multiple father |
|
34
|
|
|
if all_members[relation[1]]['father'] is None: |
|
35
|
|
|
all_members[relation[1]]['father'] = relation[0] |
|
36
|
|
|
else: |
|
37
|
|
|
return False |
|
38
|
|
|
member_group = merge_members(member_group, relation[0], relation[1]) |
|
39
|
|
|
|
|
40
|
|
|
if len(member_group) != 1: |
|
41
|
|
|
return False |
|
42
|
|
|
return True |
|
43
|
|
|
|
|
44
|
|
|
|
|
45
|
|
|
if __name__ == "__main__": |
|
46
|
|
|
# These "asserts" using only for self-checking |
|
47
|
|
|
# and not necessary for auto-testing |
|
48
|
|
|
assert is_family([['Logan', 'Mike']]) == True, 'One father, one son' |
|
49
|
|
|
assert is_family([['Logan', 'Mike'], ['Logan', 'Jack']]) == True, 'Two sons' |
|
50
|
|
|
assert ( |
|
51
|
|
|
is_family([['Logan', 'Mike'], ['Logan', 'Jack'], ['Mike', 'Alexander']]) == True |
|
52
|
|
|
), 'Grandfather' |
|
53
|
|
|
assert ( |
|
54
|
|
|
is_family([['Logan', 'Mike'], ['Logan', 'Jack'], ['Mike', 'Logan']]) == False |
|
55
|
|
|
), 'Can you be a father for your father?' |
|
56
|
|
|
assert ( |
|
57
|
|
|
is_family([['Logan', 'Mike'], ['Logan', 'Jack'], ['Mike', 'Jack']]) == False |
|
58
|
|
|
), 'Can you be a father for your brother?' |
|
59
|
|
|
assert ( |
|
60
|
|
|
is_family([['Logan', 'William'], ['Logan', 'Jack'], ['Mike', 'Alexander']]) |
|
61
|
|
|
== False |
|
62
|
|
|
), 'Looks like Mike is stranger in Logan\'s family' |
|
63
|
|
|
print("Looks like you know everything. It is time for 'Check'!") |
|
64
|
|
|
|