1. УСЛОВИЕ ЗАДАЧИ:

    Игра "Жизнь" Конвея

    Реализуйте известную игру "Жизнь" Конвея. Нужно создать программу, которая принимает двумерный массив с клетками (0 — мёртвая клетка, 1 — живая клетка) и обновляет состояние на следующем шаге по правилам:

    Живая клетка с 2 или 3 соседями остаётся живой, иначе умирает.

    Мёртвая клетка с 3 соседями оживает.

    Клетка находится в матрице, края которой могут быть "замкнутыми" (тороидальная поверхность).

    РЕШЕНИЕ-КОД НА python:

    import numpy as np
    
    def game_of_life_step(field):
        # Создаем копию поля, чтобы не изменять оригинал 😊
        new_field = np.copy(field)
        rows, cols = field.shape
    
        # Проходим по всем клеткам поля 🔍
        for i in range(rows):
            for j in range(cols):
                # Считаем живых соседей, учитывая замкнутость поля 🔄
                neighbors = np.sum(field[(i-1)%rows:(i+2)%rows, (j-1)%cols:(j+2)%cols]) - field[i, j]
    
                # Применяем правила игры 🎮
                if field[i, j] == 1:  # Живая клетка
                    if neighbors < 2 or neighbors > 3:
                        new_field[i, j] = 0  # Умирает 💀
                else:  # Мертвая клетка
                    if neighbors == 3:
                        new_field[i, j] = 1  # Оживает 🌱
    
        return new_field
    
    # Пример использования
    initial_field = np.array([
        [0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0],
        [1, 1, 1, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]
    ])
    
    # Выполняем один шаг игры
    next_step = game_of_life_step(initial_field)
    
    # Вывод результата
    print("Начальное состояние:")
    print(initial_field)
    print("\\nСостояние после одного шага:")
    print(next_step)
    

  1. УСЛОВИЕ ЗАДАЧИ:

    1. Решение головоломки "Судоку"

    Напишите программу, которая решает головоломку "Судоку". Программа должна:

    Принимать на вход частично заполненную 9×9 матрицу.

    Заполнять её по правилам Судоку.

    Возвращать правильное решение или сообщать, что головоломка неразрешима.

    def solve_sudoku(board):
        # Ищем пустую ячейку 🔍
        empty = find_empty(board)
        if not empty:
            return True  # Судоку решено! 🎉
        row, col = empty
    
        # Пробуем числа от 1 до 9 🔢
        for num in range(1, 10):
            if is_valid(board, num, (row, col)):
                board[row][col] = num
    
                # Рекурсивно решаем дальше 🔄
                if solve_sudoku(board):
                    return True
    
                # Если не получилось, возвращаемся 🔙
                board[row][col] = 0
    
        return False  # Не удалось решить 😞
    
    def find_empty(board):
        # Ищем пустую ячейку (обозначена нулем) 👀
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == 0:
                    return (i, j)
        return None
    
    def is_valid(board, num, pos):
        # Проверяем строку 📏
        for j in range(len(board[0])):
            if board[pos[0]][j] == num and pos[1] != j:
                return False
    
        # Проверяем столбец 📐
        for i in range(len(board)):
            if board[i][pos[1]] == num and pos[0] != i:
                return False
    
        # Проверяем квадрат 3x3 🔲
        box_x = pos[1] // 3
        box_y = pos[0] // 3
    
        for i in range(box_y * 3, box_y * 3 + 3):
            for j in range(box_x * 3, box_x * 3 + 3):
                if board[i][j] == num and (i, j) != pos:
                    return False
    
        return True
    
    # Пример использования
    sudoku_board = [
        [5, 3, 0, 0, 7, 0, 0, 0, 0],
        [6, 0, 0, 1, 9, 5, 0, 0, 0],
        [0, 9, 8, 0, 0, 0, 0, 6, 0],
        [8, 0, 0, 0, 6, 0, 0, 0, 3],
        [4, 0, 0, 8, 0, 3, 0, 0, 1],
        [7, 0, 0, 0, 2, 0, 0, 0, 6],
        [0, 6, 0, 0, 0, 0, 2, 8, 0],
        [0, 0, 0, 4, 1, 9, 0, 0, 5],
        [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
    
    print("Исходное судоку:")
    for row in sudoku_board:
        print(row)
    
    if solve_sudoku(sudoku_board):
        print("\\nРешение:")
        for row in sudoku_board:
            print(row)
    else:
        print("\\nРешения не существует 😕")
    
    # работает! 😃
    

  1. УСЛОВИЕ ЗАДАЧИ:
    1. Динамическая визуализация сортировок.

      Реализуйте анимацию работы алгоритмов сортировок (пузырьковой, быстрой и тд.).

Используйте библиотеку matplotlib для визуализации:

Генерируйте случайный массив чисел.

На каждом шаге сортировки обновляйте диаграмму с текущим состоянием массива.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

# Генерируем случайный массив 🎲
def generate_array(n):
    return np.random.randint(1, 101, n)

# Реализация пузырьковой сортировки 🫧
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                yield arr

# Реализация быстрой сортировки 🚀
def quick_sort(arr, low, high):
    if low < high:
        pivot = arr[high]
        i = low - 1
        for j in range(low, high):
            if arr[j] <= pivot:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]
                yield arr
        arr[i+1], arr[high] = arr[high], arr[i+1]
        yield arr
        yield from quick_sort(arr, low, i)
        yield from quick_sort(arr, i+2, high)

# Функция для анимации 🎬
def animate_sort(sort_generator, arr):
    fig, ax = plt.subplots()
    bar_rects = ax.bar(range(len(arr)), arr, align="edge")
    ax.set_xlim(0, len(arr))
    ax.set_ylim(0, int(1.1*max(arr)))
    
    iteration = [0]
    def update_fig(arr, rects):
        for rect, val in zip(rects, arr):
            rect.set_height(val)
        iteration[0] += 1
        ax.set_title(f"Итерация #{iteration[0]}")

    anim = FuncAnimation(fig, func=update_fig,
                         fargs=(bar_rects,),
                         frames=sort_generator,
                         interval=50,
                         repeat=False)
    plt.show()

# Основная часть программы
arr = generate_array(50)  # Создаем массив из 50 элементов

# Выбираем алгоритм сортировки (раскомментируй нужный)
# sort_generator = bubble_sort(arr.copy())
sort_generator = quick_sort(arr.copy(), 0, len(arr)-1)

animate_sort(sort_generator, arr)


  1. УСЛОВИЕ ЗАДАЧИ:

Простой текстовый редактор

Создайте текстовый редактор с функциональностью:

Открытие и сохранение файлов.

Кнопки для изменения шрифта (жирный, курсив, подчеркивание).

Поиск и замена текста.

import tkinter as tk
from tkinter import filedialog, messagebox
import re

class TextEditor:
    def __init__(self, master):
        # Инициализация основного окна приложения
        self.master = master
        self.master.title("Мой замечательный текстовый редактор 📝")
        
        # Настройка размера окна
        self.master.geometry("800x600")

        # Создание текстового поля для редактирования
        self.text_area = tk.Text(self.master, wrap=tk.WORD, font=("Arial", 12))
        self.text_area.pack(expand=True, fill='both', padx=10, pady=10)

        # Создание главного меню
        self.main_menu = tk.Menu(self.master)
        self.master.config(menu=self.main_menu)

        # Создание подменю "Файл"
        self.file_menu = tk.Menu(self.main_menu, tearoff=0)
        self.main_menu.add_cascade(label="Файл", menu=self.file_menu)
        self.file_menu.add_command(label="Открыть", command=self.open_file, accelerator="Ctrl+O")
        self.file_menu.add_command(label="Сохранить", command=self.save_file, accelerator="Ctrl+S")
        self.file_menu.add_separator()
        self.file_menu.add_command(label="Выход", command=self.master.quit, accelerator="Ctrl+Q")

        # Создание подменю "Редактировать"
        self.edit_menu = tk.Menu(self.main_menu, tearoff=0)
        self.main_menu.add_cascade(label="Редактировать", menu=self.edit_menu)
        self.edit_menu.add_command(label="Жирный", command=self.toggle_bold, accelerator="Ctrl+B")
        self.edit_menu.add_command(label="Курсив", command=self.toggle_italic, accelerator="Ctrl+I")
        self.edit_menu.add_command(label="Подчеркнутый", command=self.toggle_underline, accelerator="Ctrl+U")

        # Создание фрейма для поиска и замены
        self.search_frame = tk.Frame(self.master)
        self.search_frame.pack(side=tk.TOP, fill=tk.X, padx=10, pady=5)
        
        # Создание поля ввода для поиска
        self.search_label = tk.Label(self.search_frame, text="Поиск:")
        self.search_label.pack(side=tk.LEFT, padx=(0, 5))
        self.search_entry = tk.Entry(self.search_frame, width=30)
        self.search_entry.pack(side=tk.LEFT, padx=(0, 5))
        
        # Создание кнопок для поиска и замены
        self.find_button = tk.Button(self.search_frame, text="Найти", command=self.find_text)
        self.find_button.pack(side=tk.LEFT, padx=(0, 5))
        self.replace_button = tk.Button(self.search_frame, text="Заменить", command=self.replace_text)
        self.replace_button.pack(side=tk.LEFT)

        # Привязка горячих клавиш
        self.master.bind('<Control-o>', lambda event: self.open_file())
        self.master.bind('<Control-s>', lambda event: self.save_file())
        self.master.bind('<Control-q>', lambda event: self.master.quit())

    def open_file(self):
        """Метод для открытия файла"""
        file_path = filedialog.askopenfilename(
            filetypes=[("Текстовые файлы", "*.txt"), ("Все файлы", "*.*")]
        )
        if file_path:
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()
                    self.text_area.delete(1.0, tk.END)
                    self.text_area.insert(tk.END, content)
                self.master.title(f"Мой замечательный текстовый редактор - {file_path}")
            except Exception as e:
                messagebox.showerror("Ошибка", f"Не удалось открыть файл: {str(e)}")

    def save_file(self):
        """Метод для сохранения файла"""
        file_path = filedialog.asksaveasfilename(
            defaultextension=".txt",
            filetypes=[("Текстовые файлы", "*.txt"), ("Все файлы", "*.*")]
        )
        if file_path:
            try:
                content = self.text_area.get(1.0, tk.END)
                with open(file_path, 'w', encoding='utf-8') as file:
                    file.write(content)
                self.master.title(f"Мой замечательный текстовый редактор - {file_path}")
                messagebox.showinfo("Сохранение", "Файл успешно сохранен!")
            except Exception as e:
                messagebox.showerror("Ошибка", f"Не удалось сохранить файл: {str(e)}")

    def toggle_bold(self):
        """Метод для переключения жирного шрифта"""
        messagebox.showinfo("Функциональность", "Жирный шрифт (требуется дополнительная реализация)")
        # Здесь можно было бы реализовать логику изменения шрифта, например:
        # current_tags = self.text_area.tag_names("sel.first")
        # if "bold" in current_tags:
        #     self.text_area.tag_remove("bold", "sel.first", "sel.last")
        # else:
        #     self.text_area.tag_add("bold", "sel.first", "sel.last")
        # self.text_area.tag_configure("bold", font=("Arial", 12, "bold"))

    def toggle_italic(self):
        """Метод для переключения курсива"""
        messagebox.showinfo("Функциональность", "Курсив (требуется дополнительная реализация)")

    def toggle_underline(self):
        """Метод для переключения подчеркивания"""
        messagebox.showinfo("Функциональность", "Подчеркивание (требуется дополнительная реализация)")

    def find_text(self):
        """Метод для поиска текста"""
        search_term = self.search_entry.get()
        if search_term:
            self.text_area.tag_remove("search", "1.0", tk.END)
            start_pos = "1.0"
            while True:
                start_pos = self.text_area.search(search_term, start_pos, stopindex=tk.END)
                if not start_pos:
                    break
                end_pos = f"{start_pos}+{len(search_term)}c"
                self.text_area.tag_add("search", start_pos, end_pos)
                start_pos = end_pos
            self.text_area.tag_config("search", background="yellow", foreground="black")
        else:
            messagebox.showinfo("Поиск", "Введите текст для поиска")

    def replace_text(self):
        """Метод для замены текста"""
        search_term = self.search_entry.get()
        replace_term = messagebox.askstring("Заменить", "Введите текст для замены:")
        if search_term and replace_term is not None:
            content = self.text_area.get(1.0, tk.END)
            new_content = content.replace(search_term, replace_term)
            self.text_area.delete(1.0, tk.END)
            self.text_area.insert(tk.END, new_content)
            messagebox.showinfo("Замена", f"Заменено {content.count(search_term)} вхождений")
        elif not search_term:
            messagebox.showinfo("Замена", "Введите текст для поиска")

# Создание и запуск приложения
root = tk.Tk()
editor = TextEditor(root)
root.mainloop()


  1. УСЛОВИЕ ЗАДАЧИ: