Даулетбек Досай 404 группа (КФ) MroC3 12996
Арсен Жуматай,304 MroC3 12993
t1def extract_classes(code):t1def extract_classes(code):
2    result = {}2    result = {}
3    for statement in code.splitlines():3    for statement in code.splitlines():
4        statement = statement.strip()4        statement = statement.strip()
5        if not statement.startswith('class '):5        if not statement.startswith('class '):
6            continue6            continue
7        class_name_end = statement.find('(')7        class_name_end = statement.find('(')
8        if class_name_end == -1:8        if class_name_end == -1:
9            class_name_end = statement.find(':')9            class_name_end = statement.find(':')
10        class_name = statement[6:class_name_end].strip()10        class_name = statement[6:class_name_end].strip()
11        if '(' in statement:11        if '(' in statement:
12            parents_start = statement.find('(') + 112            parents_start = statement.find('(') + 1
13            parents_end = statement.find(')')13            parents_end = statement.find(')')
14            parents = statement[parents_start:parents_end].strip()14            parents = statement[parents_start:parents_end].strip()
15            parents_list = [parent.strip() for parent in parents.split('15            parents_list = [parent.strip() for parent in parents.split('
>,')] if parents else []>,')] if parents else []
16        else:16        else:
17            parents_list = []17            parents_list = []
18        result[class_name] = parents_list18        result[class_name] = parents_list
19    return result19    return result
2020
21def validate_hierarchy(classes):21def validate_hierarchy(classes):
2222
23    def resolve_mro(class_name, resolved, unresolved):23    def resolve_mro(class_name, resolved, unresolved):
24        if class_name in resolved:24        if class_name in resolved:
25            return resolved[class_name]25            return resolved[class_name]
26        if class_name in unresolved:26        if class_name in unresolved:
27            raise ValueError('Cyclic dependency detected')27            raise ValueError('Cyclic dependency detected')
28        unresolved.add(class_name)28        unresolved.add(class_name)
29        bases = classes.get(class_name, [])29        bases = classes.get(class_name, [])
30        mro = [class_name] + combine_mros([resolve_mro(base, resolved, u30        mro = [class_name] + combine_mros([resolve_mro(base, resolved, u
>nresolved) for base in bases] + [bases])>nresolved) for base in bases] + [bases])
31        resolved[class_name] = mro31        resolved[class_name] = mro
32        unresolved.remove(class_name)32        unresolved.remove(class_name)
33        return mro33        return mro
3434
35    def combine_mros(sequences):35    def combine_mros(sequences):
36        result = []36        result = []
37        while any(sequences):37        while any(sequences):
38            for seq in sequences:38            for seq in sequences:
39                if not seq:39                if not seq:
40                    continue40                    continue
41                candidate = seq[0]41                candidate = seq[0]
42                if all((candidate not in s[1:] for s in sequences)):42                if all((candidate not in s[1:] for s in sequences)):
43                    result.append(candidate)43                    result.append(candidate)
44                    for s in sequences:44                    for s in sequences:
45                        if s and s[0] == candidate:45                        if s and s[0] == candidate:
46                            s.pop(0)46                            s.pop(0)
47                    break47                    break
48            else:48            else:
49                raise ValueError('Invalid MRO')49                raise ValueError('Invalid MRO')
50        return result50        return result
51    resolved = {}51    resolved = {}
52    for class_name in classes:52    for class_name in classes:
53        resolve_mro(class_name, resolved, set())53        resolve_mro(class_name, resolved, set())
54    return True54    return True
55input_code = ''55input_code = ''
56while (line := input().strip()):56while (line := input().strip()):
57    input_code += line + '\n'57    input_code += line + '\n'
58try:58try:
59    class_structure = extract_classes(input_code)59    class_structure = extract_classes(input_code)
60    print('Yes' if validate_hierarchy(class_structure) else 'No')60    print('Yes' if validate_hierarchy(class_structure) else 'No')
61except ValueError:61except ValueError:
62    print('No')62    print('No')
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op