Advertisement
Guest User

Untitled

a guest
Oct 5th, 2024
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.19 KB | None | 0 0
  1. from colorama import Fore, Style
  2. import os
  3. import logging
  4.  
  5. logging.basicConfig(filename='graph_sequence.log', level=logging.INFO, format='%(asctime)s - %(message)s')
  6.  
  7. def is_graphic_sequence(degrees):
  8.     if sum(degrees) % 2 != 0:
  9.         return False
  10.    
  11.     degrees.sort(reverse=True)
  12.     for k in range(1, len(degrees) + 1):
  13.         left_side = sum(degrees[:k])
  14.         right_side = k * (k - 1) + sum(min(d, k) for d in degrees[k:])
  15.         if left_side > right_side:
  16.             return False
  17.    
  18.     return True
  19.  
  20. def count_edges(degrees):
  21.     return sum(degrees) // 2
  22.  
  23. def save_results(results, file_name):
  24.     file_path = f'{file_name}.txt'
  25.     with open(file_path, 'w') as f:
  26.         for seq, edges in results:
  27.             f.write(f"Последовательность {seq} корректна. Количество рёбер: {edges}\n")
  28.     return os.path.abspath(file_path)
  29.  
  30. def display_intro():
  31.     print(Fore.CYAN + "👋 Добро пожаловать в программу для проверки графических последовательностей!")
  32.     print("✏️ Введите последовательности степеней через пробел.")
  33.     print("✅ Для ввода нескольких последовательностей используйте ';' (например: '4 4 3; 5 5 4').")
  34.     print("❌ Введите 'exit' для выхода." + Style.RESET_ALL)
  35.  
  36. def validate_input(input_str):
  37.     numbers = list(map(int, input_str.strip().split()))
  38.     if any(num < 0 for num in numbers):
  39.         raise ValueError("Все числа должны быть неотрицательными.")
  40.     return numbers
  41.  
  42. def process_sequences(sequences):
  43.     results = []
  44.    
  45.     for seq_str in sequences:
  46.         sequence = validate_input(seq_str)
  47.        
  48.         if is_graphic_sequence(sequence):
  49.             edges = count_edges(sequence)
  50.             results.append((sequence, edges))
  51.             logging.info(f"Корректная последовательность: {sequence}, количество рёбер: {edges}")
  52.         else:
  53.             display_error(f"🚫 Ошибка: Последовательность {sequence} не является графической.")
  54.    
  55.     return results
  56.  
  57. def display_results(results, total_sequences):
  58.     print(Fore.GREEN + "\n✅ Корректные последовательности и количество рёбер:")
  59.    
  60.     if results:
  61.         for seq, edges in results:
  62.             print(Fore.WHITE + f"📊 Последовательность {seq} корректна. Количество рёбер: {edges}")
  63.        
  64.         print(Fore.WHITE + f"\n🔢 Всего введено последовательностей: {total_sequences}")
  65.         print(Fore.WHITE + f"✔️ Корректных последовательностей: {len(results)}")
  66.     else:
  67.         print(Fore.WHITE + "❌ Нет корректных последовательностей для сохранения.")
  68.         print(Fore.WHITE + f"\n🔢 Всего введено последовательностей: {total_sequences}")
  69.         print(Fore.WHITE + f"✔️ Корректных последовательностей: {len(results)}")
  70.  
  71. def get_save_choice():
  72.     while True:
  73.         save_choice = input(Fore.WHITE + "💾 Хотите сохранить результаты? (да/нет): ").strip().lower()
  74.        
  75.         if save_choice == 'да':
  76.             return True
  77.         elif save_choice == 'нет':
  78.             return False
  79.         else:
  80.             display_error("🚫 Ошибка: Пожалуйста, введите 'да' или 'нет'.")
  81.  
  82. def display_error(message):
  83.     print(Fore.RED + message + Style.RESET_ALL)
  84.  
  85. def main():
  86.     display_intro()
  87.    
  88.     while True:
  89.         user_input = input(Fore.WHITE + "\nВведите последовательности: ")
  90.        
  91.         if user_input.lower() == 'exit':
  92.             print(Fore.WHITE + "👋 Выход из программы.")
  93.             break
  94.        
  95.         if not user_input.strip():
  96.             display_error("🚫 Ошибка: Ввод не может быть пустым. Пожалуйста, введите последовательности.")
  97.             continue
  98.        
  99.         try:
  100.             sequences = user_input.split(';')
  101.             total_sequences = len(sequences)
  102.            
  103.             results = process_sequences(sequences)
  104.            
  105.             display_results(results, total_sequences)
  106.            
  107.             if results and get_save_choice():
  108.                 file_name = input(Fore.WHITE + "📝 Введите имя файла для сохранения (без расширения): ").strip()
  109.                 file_path = save_results(results, file_name)
  110.                 print(Fore.GREEN + f"✅ Результаты сохранены в файл '{file_path}'." + Style.RESET_ALL)
  111.             else:
  112.                 print(Fore.WHITE + "❌ Результаты не сохранены.")
  113.        
  114.         except ValueError as e:
  115.             display_error(f"🚫 Ошибка ввода: {e}")
  116.  
  117. if __name__ == "__main__":
  118.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement