Викторина проводится по следующим правилам. Вначале участник опрашивает в заданном порядке некоторых других участников, нет ли у них ответа, причём удовлетворяется первым же вариантом. Если ответа не нашлось, он может придумать свой или признаться, что не знает. Если ответ получен, он может его скорректировать (потому что нашёл недочёт) или ответить как есть. Назовём опросным планом индивидуальный список каждого участника, по которому он опрашивает остальных. Очевидно, не всякая совокупность планов хороша:
- например, участники могут начать спрашивать друг друга по кругу;
- или будет выбран первый из вариантов ответа вместо скорректированного (который идёт дальше в плане).
Впрочем,
если несколько участников, не спрашивая друг у друга, придумали или скорректировали ответ, годится любой из вариантов;
если кто-то из участников мог бы скорректировать ответ, но его спрашивать и не собирались, это тоже нормально: мало ли, отчего ему не доверяют.
Можно ли, не противореча индивидуальным опросным планам, составить полный опросный план игрока — строгую последовательность, в которой опрашиваются участники, если вопрос задан конкретному игроку?
Построчно в виде «Кто_спрашивает: Кого_спрашивает_1, Кого_спрашивает_2, …» вводится список участников и их опросных планов. Если участник считает, что он и так всё знает, план может быть пустой. Последняя строка ввода — пустая. Запятых и двоеточий в именах нет, пробелы могут встречаться только внутри и только поштучно.
Выводится строка вида «Кого_спросили: У_кого_узнать_1, У_кого_узнать_2, …» — полный опросный план для каждого из участников в порядке их ввода
- Если полный опросный план для какого-то игрока невозможен, ни один из планов не выводится, а вместо этого выводится":
«CYCLE», если участники могут начать спрашивать друг друга по кругу
«UNKNOWN», если у кого-то в плане опроса встречается неизвестный участник
«INEFFECTIVE», если кто-то может дать нескорректированный ответ, хотя мог бы узнать скорректированный
Милован Ильясович Михеев: Савватий Эдгардович Моисеев, Михалыч Савватий Эдгардович Моисеев: левый какой-то: Михалыч: Капитон Силин Капитон Силин:
Подсказка 1. Часть задачи решается с помощью graphlib.TopologicalSorter.static_order()
- Подсказка 2. Оставшаяся часть задачи — это MRO C3 в чистом виде, решается конструированием классов и перехватом соответствующего исключения
Милован Ильясович Михеев: Савватий Эдгардович Моисеев, Михалыч, Капитон Силин Савватий Эдгардович Моисеев: левый какой-то: Михалыч: Капитон Силин Капитон Силин:
Тесты ошибок:
левый какой-то: ещё более левый → UNKNOWN
Капитон Силин: Михалыч → CYCLE
Капитон Силин: Савватий Эдгардович Моисеев → INEFFECTIVE (потому что Капитон мог бы поправить Савватия, но Милован поверил Савватию, а Михалыча — который, в свою очередь, мог бы поправить Капитона, — не спросил)
