Загрузка данных


import random
import pandas as pd
from tabulate import tabulate

class LiftSimulator:
    def __init__(self):
        self.failures = {
            "Разбитое зеркало": False,
            "Занято (перегруз)": False,
            "Зажат предмет в дверях": False,
            "Нет электричества": False,
            "Нажата кнопка 'Стоп' внутри": False
        }
        self.external_factors = {
            "Кто-то курит в кабине": False,
            "Разлита жидкость на полу": False,
            "В лифте громкая музыка": False,
            "Пассажир потерял сознание": False
        }

    def apply_random_failures(self):
        for key in self.failures:
            if random.random() < 0.1:
                self.failures[key] = True

        for key in self.external_factors:
            if random.random() < 0.1:
                self.external_factors[key] = True

    def reset_state(self):
        for key in self.failures:
            self.failures[key] = False
        for key in self.external_factors:
            self.external_factors[key] = False

    def check_if_can_move(self):
        critical_failures = ["Нет электричества", "Зажат предмет в дверях", "Нажата кнопка 'Стоп' внутри"]
        for fail in critical_failures:
            if self.failures[fail]:
                return False, f"КРИТИЧЕСКАЯ ОШИБКА: {fail}"
        return True, "Лифт исправен, движение разрешено"

    def generate_report_table(self):
        data = []
        
        for failure, status in self.failures.items():
            data.append({
                "Тип": "Техническая неисправность",
                "Описание": failure,
                "Активна": "ДА" if status else "НЕТ",
                "Влияние на движение": "Блокирует" if failure in ["Нет электричества", "Зажат предмет в дверях", "Нажата кнопка 'Стоп' внутри"] else "Не блокирует"
            })
        
        for factor, status in self.external_factors.items():
            data.append({
                "Тип": "Внешний фактор",
                "Описание": factor,
                "Активна": "ДА" if status else "НЕТ",
                "Влияние на движение": "Не блокирует (дискомфорт)"
            })
        
        return pd.DataFrame(data)

    def run_simulation(self):
        print("=" * 80)
        print("СИМУЛЯТОР ЛИФТА С ВЕРОЯТНОСТЬЮ ПОЛОМОК 10%")
        print("=" * 80)
        
        self.reset_state()
        self.apply_random_failures()
        
        df = self.generate_report_table()
        print(tabulate(df, headers='keys', tablefmt='grid', showindex=False))
        
        print("\n" + "-" * 80)
        
        can_move, reason = self.check_if_can_move()
        
        if can_move:
            print("\nРЕЗУЛЬТАТ: Лифт поедет")
            print(f"   Причина: {reason}")
            
            active_external = [f for f, s in self.external_factors.items() if s]
            if active_external:
                print("   Но присутствуют внешние факторы:")
                for factor in active_external:
                    print(f"      - {factor}")
        else:
            print("\nРЕЗУЛЬТАТ: Лифт НЕ поедет")
            print(f"   Причина: {reason}")
        
        print("\n" + "=" * 80)

if __name__ == "__main__":
    simulator = LiftSimulator()
    
    for i in range(3):
        print(f"\nСИМУЛЯЦИЯ N {i+1}")
        simulator.run_simulation()
        if i < 2:
            input("\nНажмите Enter для следующей симуляции...")