class Node: # класс решений (вопрос или конечный ответ) def __init__(self, text: str): self.text = text self.is_question = text.endswith('?') self.left = None # Ссылка на левого потомка (выбор a да) self.right = None # Ссылка на правого потомка (выбор n нет) class ZooExpertSystem: # Класс для управления системой зоопарка # Отвечает за 1чтение данных, 2построение бинарного дерева решений # 3валидацию структуры и 4проведение взаимодействия с пользователем def __init__(self): # Корень построенного бинарного дерева self.root = None # Счетчики элементов всей базы знаний self.q_count = 0 # Количество вопросов self.a_count = 0 # Количество ответов (животных) # Списки для разделенных строк входа self.db_lines = [] # Строки относящиеся к базе знаний (дереву) self.user_choices = ([]) # Строки с ответами пользователя (a или n) def run(self): # контроллер запускает программу в строгом соответствии с жизненным циклом. print("Expert zo zoo to vie.") # Считываем весь поток ввода и разделяем его if not self._parse_input(): # _parse_input говорит нам что метод приватый print("Chybna databaza") return # Строим дерево решений из прочитанных строк if not self._build_tree(): # _build_tree создает цыпочку из вопросов которые приводят к ответу да или нет print("Chybna databaza") return # Выводим информацию о базе знаний self._print_stats() # Запускаем интерактивный опрос пользователя self._run_quiz() def _read_tree_lines(self) -> list[str]: # Считывает строки базы знаний из input() до первой пустой строки tree_lines = [] try: text = input().rstrip("\r") while text != "": tree_lines.append(text) text = input().rstrip("\r") except EOFError: pass return tree_lines