From 5e8556f6e0789ef8006ce9b5f53117d2c83b2526 Mon Sep 17 00:00:00 2001 From: Volodymyr Baliasnikov Date: Tue, 3 Nov 2026 15:34:15 +0100 Subject: [PATCH] U8_3 --- u8/program.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/u8/program.py b/u8/program.py index 9b6b220..605db0e 100644 --- a/u8/program.py +++ b/u8/program.py @@ -3,8 +3,8 @@ class Node: def __init__(self, text: str): self.text = text self.is_question = text.endswith('?') - self.left = None # Ссылка на левого потомка (выбор a да) - self.right = None # Ссылка на правого потомка (выбор n нет) + self.left = None # Ссылка на левого потомка (выбор t да) + self.right = None # Ссылка на правого потомка (выбор f нет) class ZooExpertSystem: # Класс для управления системой зоопарка @@ -21,7 +21,7 @@ class ZooExpertSystem: # Списки для разделенных строк входа self.db_lines = [] # Строки относящиеся к базе знаний (дереву) - self.user_choices = ([]) # Строки с ответами пользователя (a или n) + self.user_choices = ([]) # Строки с ответами пользователя (t или f) def run(self): # контроллер запускает программу в строгом соответствии с жизненным циклом. @@ -54,3 +54,55 @@ class ZooExpertSystem: except EOFError: pass return tree_lines + + def _parse_input(self) -> bool: + # Читаем базу знаний до пустой строки + self.db_lines = self._read_tree_lines() + if not self.db_lines: + return False + + # Читаем оставшиеся строки с ответами пользователя (t / f) + try: + while True: + choice = input().rstrip("\r") + self.user_choices.append(choice) + except EOFError: + pass + + return True + + def _build_tree(self) -> bool: + # Рекурсивная сборка бинарного дерева из db_lines в формате Preorder + idx = 0 + + def parse_node(): + nonlocal idx + if idx >= len(self.db_lines): + return None + + text = self.db_lines[idx] + idx += 1 + + node = Node(text) + + if node.is_question: + self.q_count += 1 + # Сначала собираем левую ветку (Да / 'a'), затем правую (Нет / 'n') + node.left = parse_node() + node.right = parse_node() + + # У каждого вопроса обязательно должны быть оба потомка + if node.left is None or node.right is None: + return None + else: + self.a_count += 1 + + return node + + self.root = parse_node() + + # Если структура ломается или в базе остались лишние неиспользованные строки + if self.root is None or idx != len(self.db_lines): + return False + + return True