wrong_family   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 50
dl 0
loc 64
rs 10
c 0
b 0
f 0
wmc 14

2 Functions

Rating   Name   Duplication   Size   Complexity  
B is_family() 0 23 6
B merge_members() 0 17 8
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