В этой статье я покажу вам, как настраивается фаервол (netfilter) на сервере Debian 11 или Ubuntu 22.04 при помощи инструмента nftables.
Архив автора: admin
Решатель судоку с графическим интерфейсом на Python
Решатель судоку в Python — это упражнение или проект начального уровня для студентов колледжей. Написание кода для решения судоку с использованием языка Python делает его проще и проще.
Судоку — это логическая игра-головоломка, в которой игроки вставляют числа от одного до девяти в сетку с девятью квадратами, разделенными на девять меньших квадратов, так что каждое число встречается один раз в горизонтальной строке, вертикальной строке и квадрате. Эта игра довольно популярна среди любителей математики. Обычно судоку печатают в ежедневных газетах, а решение публикуют на следующий день.
В этой статье рассматривается написание кода на Python для решения головоломки судоку с использованием метода рекурсии. Сначала мы займемся графическим интерфейсом, а затем приступим к решению головоломки.
Создание решателя судоку с графическим интерфейсом с использованием языка Python
Мы будем создавать решатель судоку с графическим интерфейсом, используя IDE Jetbrains Pycharm . Поскольку мы создаем впечатляющее решение для судоку с графическим интерфейсом, мы импортируем библиотеку Tkinter. Давайте начнем:
Импорт библиотеки и написание кода
Импортируйте все из Tkinter и создайте экземпляр для окна Tkinter. Установите заголовок окна как «Решатель судоку». Теперь задайте размеры окна с помощью метода Geometry. Мы принимаем размеры окон как 324×550 пикселей.
Создайте метку, которая будет указывать на использование программы. Поместите метку в 0-ю строку и первый столбец, используя метод сетки. Установленный диапазон столбца, равный 10, центрирует метку в окне.
Теперь создайте еще одну метку, которая будет использоваться, если головоломка судоку не может быть решена, и инициализируйте ее пустой строкой. Цвет переднего плана для метки ошибки в нашем случае будет красным. Используйте метод Grid, чтобы поместить метку в 15-ю строку и 1-й столбец, диапазон столбцов до 10 и отступы до 5.
Создайте метку для успеха решения судоку. Вы можете скопировать код предыдущей метки, изменить цвет переднего плана на зеленый и назвать метку решенной.
Давайте создадим пустой словарь для хранения каждой ячейки входной сетки. Определите функцию проверки для управления вводом в ячейки. В качестве аргумента принимает значение ячейки.
Блок кода:
from tkinter import *
root = Tk()
root.title("Решатель судоку")
root.geometry("324x550")
label = Label(root, text="Заполните цифры и нажмите кнопку решить").grid(row=0, column=1, columnspa=1)
errLabel = Label(root, text="", fg="red") errLabel.grid(row=15, column=1, columnspan=10, pady=5)
solvedLabel = Label(root, text="", fg="green")
solvedLabel.grid(row=15, column=1, columnspan=10, pady=5)
Напишите функцию проверки
Напишите код для проверки значения, является ли оно цифрой или пустой строкой, позволяющей пользователям удалить значение. Чтобы ограничить ввод только одной цифрой и проверить, меньше ли значение 2, верните значение логического выражения.
Блок кода:
cells = {}
def ValidateNumber(P):
out = (P.isdigit() or P == "") and len(P) < 2
return out
Регистрация функции и написание другой функции для разделения судоку на сетки 3×3
Зарегистрируйте функцию в окне, используя метод корневой регистрации. Разделите сетку судоку 9 × 9 на более мелкие фрагменты 3 × 3, написав функцию. Это примет номер строки, номер столбца и цвет фона в качестве аргумента.
Используйте цикл for с диапазоном из трех, который будет указывать строки. Используйте другой цикл for внутри него, чтобы указать столбцы. Теперь создайте виджет ввода шириной 5, bg в качестве цвета фона, а по центру выровняйте текст с помощью Justify. Кроме того, подтвердите клавишу, чтобы подтвердить функцию при нажатии клавиши.
Подтвердите команду кортежем зарегистрированной функции и кода подстановки %P, который передаст новое значение в функцию при изменении. Поместите виджет на сумму номера строки как i+1 строку и сумму номера столбца как j+1. Вы можете установить прилипание к новому, что сделает его липким со всех сторон. Установите для padx и pady значение 1, а для внутреннего заполнения значение 5.
Теперь сохраните виджет записи в словаре с кортежем номеров строк и столбцов, которые мы использовали для размещения виджета в качестве ключа.
Блок кода:
reg = root.register(ValidateNumber) defdraw3x3Grid(row, column, bgcolor): for i in range(3): forj in range(3): e = Entry(root, width=5, bg=bgcolor, justify="center", validate="key", validatecommand=(reg,"%P")) e.grid(row=row+i+1, column=column+j+1, sticky="nsew", padx=1, pady=1, ipady=5) cells[(row+i+1, column+j+1)] = e
Напишите функцию для рисования сетки 9 × 9
Мы напишем функцию для создания сетки 9×9. Мы использовали двухцветную комбинацию для этой сетки. Первый цвет означает значение. Используйте цикл for в диапазоне 1, 10 и размер шага 3 для строки №. Используйте другой цикл for внутри с диапазоном 0, 9 с размером шага 3.
Теперь вызовите функцию 3×3 и передайте номер строки, номер столбца и цвет. Чтобы чередовать цвета, используйте условие if. Если значением переменной цвета является первый цвет, мы установим его на второй цвет. В противном случае мы установим его на первый цвет. При написании цветовых кодов следите за регистром букв.
Блок кода:
def draw9x9Grid(): color = "#D0MT" for rowNo in range(1, 10, 3): for colNo in range(0, 9, 3): draw3x3Grid(rowNo, colNo, color) if color == "#Doffff": color = "#ffffd0" else: color = "#Doffff"
Напишите функцию для очистки судоку
Мы напишем функцию очистки значений для судоку, которая очистит значения в каждой ячейке сетки. Во-первых, удалите ошибки и метки успеха. Опять же, повторите строки и столбцы. Диапазон для строки будет 2, 11, а диапазон для столбцов будет 1, 10.
Вызвать виджет записи, который мы сохранили в словаре, в данной строке и столбце. Используйте метод удаления виджета ввода, чтобы удалить его значение от индекса 0 до конца.
Блок кода:
defclearValues(): errLabel.configure(text="") solvedLabel.configure(text="") for row in range(2, 11): for col in range(1, 10): cell = cells[(row, col)] cell.delete(0, "end")
Напишите функцию для получения ввода от пользователя
Напишите функцию получения значений и объявите пустой список для хранения значений для каждой ячейки для каждой строки. Снова очистите все метки, чтобы очистить текст, если он есть. Используйте цикл for для перебора диапазона 2, 11 для строк и 1, 10 для столбцов. Теперь получите значение ячеек, используя метод get виджетов ввода. Если значение представляет собой пустую строку, мы добавим 0 к списку строк. В противном случае добавьте в список целочисленное значение.
После окончания цикла добавьте список строк в список доски.
Блок кода:
defgetValues(): board = [] errLabel.configure(text="") solvedLabel.configure(text="") for row in range(2, 11): rows = [] for col in range(1, 10): val = cells[(row, col)].get() if val = "" rows. append(0) else: rows.append(int(val)) board.append(rows)
Написание кода для кнопок
Используя виджет кнопки, создайте кнопку. Установите команду для получения значений, текста для решения и ширины на 10. Теперь поместите кнопку в 20-ю строку и первый столбец с диапазоном столбцов 5, как 20.
Создайте еще одну кнопку, скопировав тот же код, установите ее команду на очистку значений и текст на очистку. Поместите эту кнопку в 5-й столбец.
Блок кода:
btn = Button(root, command=getValues, text="Solve", width=10) btn.grid(row=20, column=1, columnspan=5, pady=20) btn = Button(root, command=clearValues, text="Clear", width=10) btn.grid(row=20, column=1, columnspan=5, pady=20)
Вызов функций
Вызовите функции сетки 9×9 и метод основного цикла root, чтобы запустить экземпляр нашего созданного окна.
draw9x9Grid() root.mainloop()
Написание кода
Сначала мы объявим переменную, которая будет содержать количество строк и столбцов. Напишите вопрос, который будет проверять данное число для данной строки или столбца. Это примет судоку, номер строки, номер столбца и номер в качестве аргументов. Чтобы проверить, существует ли такое же число в той же строке, мы будем использовать цикл for в диапазоне 9. Условие цикла for выглядит следующим образом: если номер данной строки и i-го столбца равен num, мы вернемся ЛОЖЬ.
Точно так же мы проверим, существует ли такое же число в том же столбце. Используйте цикл for в диапазоне 9. Если номер данного столбца и j-й строки равен num, мы вернем false.
Теперь нам нужно проверить, существует ли такое же число в его конкретной сетке 3×3. Начальная строка будет строкой, вычтенной из модуля строки 3. Начальным столбцом будет столбец, вычтенный из модуля столбца 3.
Используйте два вложенных цикла в диапазоне от трех. Если число в начальной строке плюс i-я строка и начальный столбец плюс j-й столбец равны num, мы вернем False. В конце функции мы вернем True, которая будет выполнена, если ни одно из предыдущих условий не будет выполнено.
Блок кода:
N = 9 defisSafe(sudoku, row, col, num): for i in range(9): ifsudoku[row][i] - num: return False for i in range(9): ifsudoku[i][col] == num: return False startRow = row - row % 3 startCol = col - col % 3 for i in range(3): for j in range(3): ifsudoku[startRow + i][startCol + j] =num: return False return Truc
Напишите функцию для присвоения значений не назначенным местоположениям
Мы напишем функцию решения судоку для присвоения значений не назначенным позициям. Это будет включать матрицу судоку, начальный номер строки и начальный номер столбца в качестве аргументов.
Давайте проверим, равна ли строка N-1, а столбец равен n. Если условие преобладает, мы вернем true. Это условие будет базовым, так как мы будем использовать рекурсию для решения головоломки. После того, как последний столбец будет достигнут, мы перейдем к следующему столбцу. Если столбец равен n, мы добавим единицу к строке и установим столбец обратно в ноль. Теперь мы проверим, присвоен ли номер текущему местоположению.
Если число в данной строке и столбце больше нуля, мы вернем функцию решения судоку для следующего столбца. Используйте цикл for в диапазоне 1, N+1 для проверки каждого числа от 1 до 9.
Теперь мы проверим, можно ли присвоить это число заданной строке и столбцу, используя функцию, которую мы написали ранее. Если можно присвоить номер, мы присвоим его в судоку. Допустим, присвоенный номер правильный. Мы также проверим возможность со следующей колонкой.
В блоке кода циклов мы переназначим 0, поскольку наше предположение было неверным, и оно подтверждает следующее значение. Верните false в конце блока кода функций.
Блок кода:
startCol = col - col % 3 for i in range(3): for j in range(3): if sudoku[startRow + i][startCol + j] == num: return False return True defsolveSudoku(sudoku, row, col): ifrow== N - 1 and col == N: return True ifcol == N: row += l col = 0 ifsudoku[row][col] > 0: return solveSudoku(sudoku, row, col + 1)
for num in range(1, N + 1): if isSafe(sudoku, row, col, num): sudoku[row][col] = num if solveSudoku(sudoku, row, col + 1): return True sudoku[row][col] = 0 return False
Напишите функцию для решенной судоку
Мы напишем функцию, которая будет возвращать решенную судоку, если она разрешима. Это примет судоку в качестве аргумента. Чтобы узнать, разрешима ли судоку, используйте условие if. Мы вернем судоку, если это разрешимо. В противном случае мы вернем No.
Сохраните этот файл как Solver.py в той же папке, где вы сохранили файл GUI.
Блок кода:
det solver(sudoku): if solveSudoku(sudoku, 0, 0): return sudoku else: return "no"
Импорт функции решения в файл GUI
Откройте файл GUI и импортируйте функцию решения из файла Solver.py. Напишите функцию обновления значений, которая будет обновлять ячейки и отображать решение судоку. В качестве аргумента будет использоваться матрица судоку.
Вызовите функцию решения и передайте ей судоку. Если решение не равно NO, используйте цикл for в диапазоне 2, 11. Внутри цикла for используйте другой цикл for с диапазоном 1, 10. Удалите существующие значения из ячейки. Используйте метод вставки, чтобы вставить значение в 0-й индекс.
Значением будет число строк минус вторая строка и столбец минус первый столбец. Вычитаем 2 и 1 соответственно, так как матрица нулевая.
После того, как цикл установлен, текст решаемой метки для судоку решается с использованием метода конфигурации. В остальной части мы установим текст меток ошибок, чтобы решение не существовало.
from tkinter import *
from solver import solve
root = Tk()
root.title("Решатель судоку")
root.geometry("324x550")
Вызов значений обновления
Вызовите функцию получения значений в конце и передайте матрицу доски.
На данный момент наша окончательная программа готова к выполнению.
Вывод
Вы можете создать решатель судоку, используя метод рекурсии, как мы сделали здесь. Но разработка решателя судоку с графическим интерфейсом требует большего внимания к вашим навыкам кодирования и упрощает решение головоломок судоку.
Этот пост разделен на части для удобства сопровождения кода. Надеюсь, вам понравилось читать эту статью.
Программное обеспечение с открытым исходным кодом для малого и среднего бизнеса и фрилансеров

Несмотря на то, что большое количество компаний (любого размера), учреждений, организаций и фрилансеров работают с Microsoft Windows и многочисленным и разнообразным проприетарным программным обеспечением, GNU/Linux также может иметь пробел, как и свободное программное обеспечение с открытым исходным кодом. На самом деле такого рода программное обеспечение может иметь фантастические преимущества для малого и среднего бизнеса и фрилансерови даже для крупных корпораций.
Кроме того, после пандемического кризиса не платить лицензии Это также может быть огромным преимуществом в снижении расходов практически любой гильдии и типа colectivos, но это не единственная положительная вещь, которую могут внести это программное обеспечение и операционные системы GNU/Linux. С другой стороны, избитый стереотип бесплатного программного обеспечения = низкое качество иссякает аргументы…
Лучшие мобильные игровые движки и платформы для разработки. Часть 2
6. AppGameKit
7. Construct 3
8. Fusion 2.5
9. GameMaker Studio 2
10. MonoGame
Начало:
Установите Kali Linux на Windows с помощью WSL
WSL или также известная как подсистема Windows для Linux — это компонент ОС Windows, который позволяет нам запускать файловую систему Linux рядом с вашим обычным настольным компьютером и программами. Он поставляется в сочетании с консольными утилитами Linux и инструментами графического пользовательского интерфейса. Это действительно уровень соответствия, который позволяет различным операционным системам Windows правильно выполнять собственные исполняемые файлы Linux.
Как правило, это платформа для веб-программистов, разработчиков бесплатных программ с открытым исходным кодом и тех, кто предоставляет настройки сервера Linux. WSL может использовать любой, кто любит работать с Bash, стандартными приложениями Linux и программными платформами, а также с приложениями для повышения производительности Windows. Итак, эта статья предназначена для всех тех пользователей, которые хотят установить kali Linux на Windows 10 с помощью WSL на PowerShell.
Включите WSL в Windows:
Убедитесь, что ваша система Windows уже обновлена. Чтобы использовать WSL в любой системе Windows, необходимо иметь сборку, равную или выше 18362. В противном случае мы не сможем установить kali Linux в системе Windows, используя подсистему Windows для Linux (WSL). Начните с запуска Windows PowerShell от имени администратора. Щелкнув по нему правой кнопкой мыши, вы можете выбрать «Запуск от имени администратора» в меню.
В вашей системе откроется синий экран Windows PowerShell. Чтобы включить WSL в нашей системе Windows 10, вам необходимо выполнить инструкцию, показанную на изображении, в вашей PowerShell без единой ошибки. Включение займет немного времени.
PS C:WINDOWSsystem32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
После того, как строка обработки включения функции достигла 100 процентов, WSL успешно включается на нашем конце, как показано на изображении ниже.
Включить виртуальную машину в Windows:
После включения инструмента WSL в нашей системе пришло время также включить инструмент платформы виртуальной машины в нашей системе. Хотя это необязательная функция для установки, она может быть очень полезной. Используйте ту же самую старую инструкцию в PowerShell с названием функции «VirtualMachinePlatform», чтобы установить ее. Строка обработки включения функции показывает процесс ее включения.
import pandas
d_frame = pandas.DataFrame({'Salary':[39000, 44000, 25000, 55000], "EmpLoyee Name':["ALex", "Andrew", "Zack', "Kim'], Age : [39, 44, 25, 55]})
index_ = pandas.date_range("2020-08-05 07:30", periods = 4, freq ='H')
d_frame.index = index_
print(d_frame)
В течение не более 1 минуты он будет полностью включен в нашей системе в соответствии со 100-процентной полосой обработки. Kali Linux теперь можно загрузить и установить в Windows.
Загрузите пакет обновления WSL Linux:
Совершенно необходимо обновить нашу систему Linux. Для этого нам нужно загрузить пакет обновления ядра Linux для WSL и установить его в нашей системе Windows. После его установки попробуйте перезагрузить систему Windows 10, чтобы обновить ее.
#include<iostream>
using namespace std;
void swap(int &x, int &y) {
int temp;
temp = x;
x = y;
y = temp;
Установите версию по умолчанию для WSL:
После перезагрузки и входа в систему вам нужно снова открыть PowerShell и установить версию WSL, которую вы хотите использовать по умолчанию. Для этого попробуйте использовать команду «wsl» с параметром «—set-default-version», за которым следует номер версии (например, 2.)
Мы использовали версию 2 по умолчанию для WSL здесь, в нашей системе Windows 10. Через некоторое время он будет установлен, и теперь ваша система готова для загрузки и установки на нее kali Linux.
PS C:WINDOWSsystem32> wsl -- -set-default-version 2
Скачайте и установите Kali Linux:
Чтобы получить Kali Linux в вашей системе, вам необходимо сначала загрузить его. Чтобы загрузить, вам нужно использовать Microsoft Store вашей системы Windows 10 и выполнить поиск «Kali Linux». Вам будет предоставлен инструмент kali Linux на вашем экране, как показано ниже. Рядом с ним нажмите кнопку «Get». На изображении показан результат.
Он начнет загрузку Kali Linux в вашей системе Windows 10 для использования. Вы увидите количество загруженных байтов в мегабайтах по сравнению с общим количеством мегабайтов, необходимых для загрузки, а также текст «downl…» под кнопкой загрузки загрузки. На изображении показан результат.
Когда процесс загрузки Kali Linux будет завершен, на той же кнопке появится текст «Open». Вы должны нажать на него, чтобы начать установку в Windows 10. На изображении показан результат.
Теперь на рабочем столе Windows 10 появится черный экран с названием «Kali Linux Rolling». На изображении показан результат.
Подождите некоторое время, пока он не попросит вас создать новое имя пользователя и его пароль. Появится текстовая панель «Введите новое имя пользователя Unix:». Вам нужно добавить новое имя пользователя, чтобы создать пользователя root.
После добавления имени пользователя, например «test», вам будет предложено создать новый пароль, а также повторно ввести этот пароль. После добавления пароля установка Kali Linux будет завершена, и консоль Kali Linux откроется на том же самом черном экране. На изображении показан результат.
Мы попробовали инструкцию «обновить» с пакетом «apt» в области консоли, и она запрашивает наш пароль root для продолжения. Мы добавили к нему наш текущий добавленный пароль, и он начал обновлять саму Kali Linux без каких-либо задержек. На изображении показан результат.
Операционная система Kali Linux будет обновлена через несколько секунд, как показано ниже.
Вывод:
Речь идет об установке Kali Linux в операционной системе Windows 10 с использованием подсистемы Windows для Linux. Мы начали эту статью с того, что сначала включили WSL и инструменты виртуальных машин в Windows 10 с помощью PowerShell. Мы также установили обновление Linux для WSL и загрузили Kali Linux. Хорошо заканчивается установкой его со скачанным.
Как отсортировать массив в Java
В языках программирования сортировка играет очень важную роль, поскольку снижает сложность. В Java термин сортировка означает упорядочение элементов/значений в определенном порядке, то есть по возрастанию или по убыванию. Если говорить о сортировке массивов, то это можно сделать с помощью некоторых встроенных методов, пользовательских методов, циклов и т. д. Эти подходы к сортировке способны сортировать любой тип массива, например, числовой или алфавитный.
В этой статье будут подробно рассмотрены перечисленные ниже процедуры сортировки массивов:
- Как отсортировать массив с помощью метода sort()
- Как отсортировать массив с помощью метода reverseOrder()
- Как отсортировать массив с помощью Loop
Итак, приступим!
Как отсортировать массив с помощью метода sort()
Java предлагает множество процедур для сортировки массива, и среди них самым простым и легким способом является использование встроенных методов. Предопределенный класс Java с именем « Arrays » предоставляет метод статического типа, известный как метод sort(), который можно вызывать/вызывать непосредственно с именем класса. Он сортирует массив в порядке возрастания и может принимать данные типа int, char, float, byte, long и double.
Лучший способ понять концепцию — поэкспериментировать с ней, поэтому рассмотрите приведенный ниже фрагмент кода, который поможет нам понять, как использовать метод sort() в java.
Пример
В этом примере у нас есть массив строкового типа, состоящий из пяти элементов. Мы будем использовать метод sort() для упорядочения элементов массива в порядке возрастания:
import java.util.Arrays;
public class SortingExample {
public static void main(String[] args) {
String[] arr = new String[]{"AndreyEx", "Maxim", "Alex", "Daria", "Alex"};
Arrays.sort(arr);
System.out.println("Отсортированный массив: ");
for (String arr1 : arr) {
System.out.println(arr1);
}
}
}
Мы передали массив методу Arrays.sort(), чтобы отсортировать массив в порядке возрастания. После этого мы использовали цикл for-each для перебора каждого элемента массива.
А что, если нам нужно расположить элементы массива в обратном порядке? Что ж, в таком случае мы должны использовать метод reverseOrder() предопределенного класса Collection Java.
Как отсортировать массив с помощью метода reversreOrder()
reverOrder() — это статический метод, что означает, что его можно вызывать непосредственно с именем класса.
Пример
Мы рассмотрим тот же массив, что и в предыдущем примере, но на этот раз воспользуемся методом reverseOrder() для сортировки массива в обратном порядке:
public class SortingExample {
public static void main(String[] args) {
String[] arr = new String[]{"AndreyEx", "Maxim", "Alex", "Daria", "Alex"};
Arrays.sort(arr, Collections.reverseOrder());
System.out.println("Отсортированный массив: ");
for (String arr1 : arr) {
System.out.println(arr1);
}
}
}
Мы передали «имя массива» и метод «Collections.reverseOrder()» в метод Arrays.sort();.
Как отсортировать массив с помощью Loop
В Java мы можем сортировать массивы с помощью цикла for. Пример, приведенный ниже, позволит вам понять, как сортировать массив с помощью цикла for:
public class SortingExample {
public static void main(String[] args) {
String[] arr = new String[]{"AndreyEx", "Maxim", "Alex", "Daria", "Alex"};
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
String tmp = null;
if (arr[i].compareTo(arr[j]) > 0) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
System.out.println(arr[i]);
}
}
}
В приведенном выше фрагменте мы выполнили следующие функции:
- Мы использовали вложенные циклы for для обработки двух соседних элементов массива.
- После этого мы использовали метод compareTo для сравнения элементов массива (строкового типа) с другими элементами массива.
- Поскольку мы работаем со строками, мы использовали метод compareTo(). Если нам нужно работать с числовыми значениями, мы можем использовать оператор сравнения.
- В операторе if мы использовали временную переменную для замены элементов массива при необходимости.
Вывод
Для сортировки массива в java можно использовать различные предопределенные методы, циклы java и пользовательские методы. Массив Java может быть отсортирован как по возрастанию, так и по убыванию. Метод Arrays.sort() сортирует массив в порядке возрастания, а метод Collections.reverseOrder() можно использовать для сортировки массива в порядке убывания. Кроме того, в циклах Java можно использовать методы подкачки для сортировки массива в порядке возрастания или убывания в зависимости от выбора пользователя. В этой статье объясняются различные аспекты сортировки массивов в java.












