Sabua8 WhatWhereWho 6937
Тулинова Олеся Вадимовна, 442 группа WhatWhereWho 8584
t1import syst1import sys
2from graphlib import TopologicalSorter, CycleError2from graphlib import TopologicalSorter, CycleError
33
4def read_input():4def read_input():
5    lines = []5    lines = []
6    for line in sys.stdin:6    for line in sys.stdin:
7        line = line.rstrip('\n')7        line = line.rstrip('\n')
8        if line == '':8        if line == '':
9            break9            break
10        lines.append(line)10        lines.append(line)
11    return lines11    return lines
1212
13def parse(lines):13def parse(lines):
14    order = []14    order = []
15    plans = {}15    plans = {}
16    for line in lines:16    for line in lines:
17        if ':' not in line:17        if ':' not in line:
18            name = line.strip()18            name = line.strip()
19            rest = ''19            rest = ''
20        else:20        else:
21            name, rest = line.split(':', 1)21            name, rest = line.split(':', 1)
22            name = name.strip()22            name = name.strip()
23            rest = rest.strip()23            rest = rest.strip()
24        if rest == '':24        if rest == '':
25            asks = []25            asks = []
26        else:26        else:
27            asks = [part.strip() for part in rest.split(',') if part.str27            asks = [part.strip() for part in rest.split(',') if part.str
>ip() != '']>ip() != '']
28        if name in plans:28        if name in plans:
29            pass29            pass
30        else:30        else:
31            order.append(name)31            order.append(name)
32        plans[name] = asks32        plans[name] = asks
33    return (order, plans)33    return (order, plans)
3434
35def main():35def main():
36    lines = read_input()36    lines = read_input()
37    if not lines:37    if not lines:
38        return38        return
39    order, plans = parse(lines)39    order, plans = parse(lines)
40    names = set(order)40    names = set(order)
41    for name, asks in plans.items():41    for name, asks in plans.items():
42        for a in asks:42        for a in asks:
43            if a not in names:43            if a not in names:
44                print('UNKNOWN')44                print('UNKNOWN')
45                return45                return
46    deps = {name: set(plans[name]) for name in order}46    deps = {name: set(plans[name]) for name in order}
47    try:47    try:
48        topo = list(TopologicalSorter(deps).static_order())48        topo = list(TopologicalSorter(deps).static_order())
49    except CycleError:49    except CycleError:
50        print('CYCLE')50        print('CYCLE')
51        return51        return
52    classes = {}52    classes = {}
53    try:53    try:
54        for nm in topo:54        for nm in topo:
55            base_names = plans[nm]55            base_names = plans[nm]
56            bases = tuple((classes[b] for b in base_names))56            bases = tuple((classes[b] for b in base_names))
57            cls = type(nm, bases, {})57            cls = type(nm, bases, {})
58            classes[nm] = cls58            classes[nm] = cls
59    except TypeError:59    except TypeError:
60        print('INEFFECTIVE')60        print('INEFFECTIVE')
61        return61        return
62    for nm in order:62    for nm in order:
63        cls = classes[nm]63        cls = classes[nm]
64        mro = cls.mro()64        mro = cls.mro()
65        plan = [c.__name__ for c in mro[1:] if c.__name__ in names]65        plan = [c.__name__ for c in mro[1:] if c.__name__ in names]
66        if plan:66        if plan:
67            print(f"{nm}: {', '.join(plan)}")67            print(f"{nm}: {', '.join(plan)}")
68        else:68        else:
69            print(f'{nm}:')69            print(f'{nm}:')
70if __name__ == '__main__':70if __name__ == '__main__':
71    main()71    main()
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op