From c18e89e18c35b20415c697dd302e7999aced3a47 Mon Sep 17 00:00:00 2001 From: Roman Dmytruk Date: Tue, 3 Nov 2026 14:54:10 +0000 Subject: [PATCH] Add u8/program.py --- u8/program.py | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 u8/program.py diff --git a/u8/program.py b/u8/program.py new file mode 100644 index 0000000..72ddb32 --- /dev/null +++ b/u8/program.py @@ -0,0 +1,140 @@ +import sys +from dataclasses import dataclass + + +# dátová struktúra pre uzol stromu / датова структура для вузла дерева + +@dataclass +class Node: + text: str + left: "Node | None" = None # Vetva 'a' (áno) / Гілка 'a' (так) + right: "Node | None" = None # Vetva 'n' (nie) / Гілка 'n' (ні) + + +# rekurzívne načítanie bázy znalostí (preorder) +# рекурсивне читання бази знаноь (преордер) + +def read_node(lines_iterator): + # Rekurzívne načíta uzol a jeho podstromy vo formáte preorder. + # Рекурсивно зчитує вузол та його піддерева у форматі preorder. + + try: + line = next(lines_iterator) + except StopIteration: + raise ValueError("Chýba očakávaný uzol") + + # Odstránime iba znaky konca riadka (\n, \r) + # Видаляємо лише символи кінця рядка (\n, \r) + text = line.rstrip("\r\n") + + # Kontrola prázdneho riadka na konci bázy + # Перевірка порожнього рядка в кінці бази + if text == "": + raise ValueError("Chýba očakávaný uzol") + + node = Node(text=text) + + # Ak sa text končí na '?', ide o otázku s dvoma potomkami (ľavý = áno, pravý = nie) + # Якщо текст закінчується на '?', це питання з двома потомками (лівий = так, правий = ні) + if node.text.endswith("?"): + node.left = read_node(lines_iterator) + node.right = read_node(lines_iterator) + + return node + + +# rekurzívne počítanie prvkov bázy +# рекурсивний підрахунок елементів бази + +def count_questions(node): + # Spočíta všetky vnútorné uzly (otázky končiace znakom '?'). + # Підраховує всі внутрішні вузли (питання, що закінчуються на '?'). + + if node is None: + return 0 + + is_question = 1 if node.text.endswith("?") else 0 + return is_question + count_questions(node.left) + count_questions(node.right) + + +def count_answers(node): + # Spočíta všetky listové uzly (konečné odpovede / zvieratá). + # Підраховує всі листові вузли (кінцеві відповіді / звірів). + + if node is None: + return 0 + + if node.left is None and node.right is None: + return 1 + + return count_answers(node.left) + count_answers(node.right) + + +# prehľadávanie stromu a dialóg s používateľom +# пошук у дереві та діалог з користувачем + +def search(node): + # Prechádza stromom podľa volieb používateľa až po konečnú odpoveď. + # Проходить по дереву відповідно до вибору користувача до кінцевої відповіді. + + # Vypíšeme text aktuálneho uzla (otázku alebo zviera) + # Виводимо текст поточного вузла (питання або звіра) + + print(node.text) + + # Ak sme v liste, našli sme zviera - vypíšeme Koniec a skončíme + # Якщо ми в листі, ми знайшли звіра - виводимо Koniec і завершуємо + if node.left is None and node.right is None: + print("Koniec") + return + + # Načítanie voľby používateľa ('a' alebo 'n') + # Зчитування вибору користувача ('a' або 'n') + choice_line = sys.stdin.readline() + if choice_line == "": + return # Neočakávaný koniec vstupu / Несподіваний кінець входу + + choice = choice_line.rstrip("\r\n") + + # Spracovanie voľby: 'a' ideme vľavo, 'n' ideme vpravo + # Обробка вибору: 'a' перехід ліворуч, 'n' перехід праворуч + if choice == 'a': + search(node.left) + elif choice == 'n': + search(node.right) + else: + # Neplatná voľba ukončí program + # Некоректний вибір завершує програму + return + + +def main(): + # Požadovaný úvodný výpis + # Обов'язковий стартовий вивід + print("Expert zo zoo to vie.") + + # Načítanie celého vstupu do iterátora + # Зчитування всього входу в ітератор + lines_iterator = iter(sys.stdin.read().splitlines(keepends=True)) + + try: + root = read_node(lines_iterator) + except (ValueError, StopIteration): + return + + # Výpočet a výpis celkových štatistík bázy + # Підрахунок та вивід загальної статистики бази + q_count = count_questions(root) + a_count = count_answers(root) + + print(f"Pocet otazok: {q_count}") + print(f"Pocet odpovedi: {a_count}") + print("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.") + + # Spustenie dialógu od koreňa + # Запуск діалогу від кореня + search(root) + + +if __name__ == "__main__": + main() \ No newline at end of file