Monday, August 19, 2024

GUI based Sudoku Solver

import tkinter as tk

from tkinter import messagebox


def is_valid(board, row, col, num):

  for i in range(9):

    if board[row][i] == num or board[i][col] == num:

      return False

  

  start_row, start_col = 3 * (row // 3), 3 * (col // 3)

  for i in range(start_row, start_row + 3):

    for j in range(start_col, start_col + 3):

      if board[i][j] == num:

        return False

  

  return True


def solve_sudoku(board):

  for row in range(9):

    for col in range(9):

      if board[row][col] == 0:

        for num in range(1, 10):

          if is_valid(board, row, col, num):

            board[row][col] = num

            if solve_sudoku(board):

              return True

            board[row][col] = 0

        return False

  return True


def extract_values():

  board = []

  for i in range(9):

    row = []

    for j in range(9):

      val = entries[i][j].get()

      if val == "":

        row.append(0)

      else:

        try:

          row.append(int(val))

        except ValueError:

          messagebox.showerror("Invalid input", f"Invalid value at row {i+1}, column {j+1}. Please enter numbers 1-9.")

          return None

    board.append(row)

  return board


def display_solution(board):

  for i in range(9):

    for j in range(9):

      entries[i][j].delete(0, tk.END)

      entries[i][j].insert(0, str(board[i][j]))


def solve():

  board = extract_values()

  if board:

    if solve_sudoku(board):

      display_solution(board)

    else:

      messagebox.showinfo("No solution", "This Sudoku puzzle has no solution.")


def clear_board():

  for i in range(9):

    for j in range(9):

      entries[i][j].delete(0, tk.END)


# Initialize GUI window

root = tk.Tk()

root.title("Sudoku Solver")


# Create 9x9 grid of Entry widgets

entries = []

for i in range(9):

  row_entries = []

  for j in range(9):

    entry = tk.Entry(root, width=3, font=("Arial", 18), justify="center")

    entry.grid(row=i, column=j, padx=5, pady=5)

    row_entries.append(entry)

  entries.append(row_entries)


solve_button = tk.Button(root, text="Solve", command=solve, font=("Arial", 14))

solve_button.grid(row=9, column=3, columnspan=3, pady=10)


clear_button = tk.Button(root, text="Clear", command=clear_board, font=("Arial", 14))

clear_button.grid(row=10, column=3, columnspan=3, pady=10)


root.mainloop()


Text based Sudoku Solver

def is_valid(board, row, col, num):

  for i in range(9): # Number repeated in row?

    if board[row][i] == num:

      return False

  

  for i in range(9): # Number repeated in column?

    if board[i][col] == num:

      return False

  

  # Is number repeated in 3x3 subgrid

  start_row, start_col = 3 * (row // 3), 3 * (col // 3)

  for i in range(start_row, start_row + 3):

    for j in range(start_col, start_col + 3):

      if board[i][j] == num:

        return False


  return True


def solve_sudoku(board):

  for row in range(9):

    for col in range(9):

      if board[row][col] == 0:

        for num in range(1, 10):

          if is_valid(board, row, col, num):

            board[row][col] = num

            if solve_sudoku(board):

              return True

            board[row][col] = 0

        return False

  return True


def print_board(board):

  for row in board:

    print(" ".join(str(num) for num in row))


grid = [[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]

       ]


if solve_sudoku(grid):

  print("Sudoku Solved:")

  print_board(grid)

else:

  print("No solution exists.")


Sunday, August 18, 2024

Convert each pixel of one color to another color

# Convert each pixel of one color to another color

# Error value allows pixels +- that error value to also be converted


from PIL import Image


img = Image.open("Just.png")

img = img.convert("RGB")

pixels = img.load()


target_color = (237, 238, 247)

replacement_color = (255, 255, 255)


width, height = img.size

error = 10 # Allowing for variation in pixel value


for x in range(width):

  for y in range(height):

    if pixels[x, y][0] >= target_color[0] - error and pixels[x, y][0] <= target_color[0] + error:

      if pixels[x, y][1] >= target_color[1] - error and pixels[x, y][1] <= target_color[1] + error:

        if pixels[x, y][2] >= target_color[2] - error and pixels[x, y][2] <= target_color[2] + error:

          pixels[x, y] = replacement_color


img.save("Converted.png")

img.show()


Friday, August 2, 2024

Download Youtube videos

# pip install yt-dlp


import yt_dlp


def download_youtube_video(url, save_path='.'):

  ydl_opts = {'outtmpl': f'{save_path}/%(title)s.%(ext)s', 'format': 'best'

  }

  try:

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:

      ydl.download([url])

    print("Download completed!")

  except Exception as e:

    print(f"An error occurred: {e}")


video_url = "https://www.youtube.com/watch?v=-5ef7epnR60"

download_youtube_video(video_url)