УСЛОВИЕ ЗАДАЧИ:
Игра "Жизнь" Конвея
Реализуйте известную игру "Жизнь" Конвея. Нужно создать программу, которая принимает двумерный массив с клетками (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)
УСЛОВИЕ ЗАДАЧИ:
Напишите программу, которая решает головоломку "Судоку". Программа должна:
Принимать на вход частично заполненную 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Решения не существует 😕")
# работает! 😃
Динамическая визуализация сортировок.
Реализуйте анимацию работы алгоритмов сортировок (пузырьковой, быстрой и тд.).
Используйте библиотеку 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)
Простой текстовый редактор
Создайте текстовый редактор с функциональностью:
Открытие и сохранение файлов.
Кнопки для изменения шрифта (жирный, курсив, подчеркивание).
Поиск и замена текста.
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()