personalspace / app.py
ravim254's picture
Upload app.py
bb1c379 verified
import gradio as gr
# --- SUDOKU SOLVER LOGIC ---
class SudokuSolver:
def __init__(self, grid):
self.grid = grid
def is_valid(self, row, col, num):
for i in range(9):
if self.grid[row][i] == num or self.grid[i][col] == num:
return False
box_row, box_col = 3 * (row // 3), 3 * (col // 3)
for r in range(box_row, box_row + 3):
for c in range(box_col, box_col + 3):
if self.grid[r][c] == num:
return False
return True
def solve_logic(self):
"""Fill only the cells we can be 100% sure about using box logic."""
while True:
changed = False
for digit in range(1, 10):
for box_row in range(3):
for box_col in range(3):
possible = []
for r in range(box_row * 3, (box_row + 1) * 3):
for c in range(box_col * 3, (box_col + 1) * 3):
if self.grid[r][c] == 0 and self.is_valid(r, c, digit):
possible.append((r, c))
if len(possible) == 1:
r, c = possible[0]
self.grid[r][c] = digit
changed = True
if not changed:
break
def solve_backtracking(self):
"""Classic backtracking for full solution."""
empty = self.find_empty()
if not empty:
return True
r, c = empty
for num in range(1, 10):
if self.is_valid(r, c, num):
self.grid[r][c] = num
if self.solve_backtracking():
return True
self.grid[r][c] = 0
return False
def find_empty(self):
for r in range(9):
for c in range(9):
if self.grid[r][c] == 0:
return r, c
return None
# --- GRADIO UI FUNCTION ---
def solve_sudoku(input_text, method):
try:
flat = [int(c) for c in input_text if c.isdigit()]
if len(flat) != 81:
return "Please enter exactly 81 digits (0 for blanks)"
grid = [flat[i*9:(i+1)*9] for i in range(9)]
solver = SudokuSolver(grid)
solver.solve_logic()
if method == "Logic + Backtracking":
solver.solve_backtracking()
# Return a formatted string
output = '\n'.join(' '.join(str(n) for n in row) for row in solver.grid)
return output
except Exception as e:
return f"Error: {e}"
# --- GRADIO APP ---
gr.Interface(
fn=solve_sudoku,
inputs=[
gr.Textbox(
lines=9,
label="Enter 81 digits (0 = blank)",
placeholder="e.g.\n003000010\n060204070\n..."
),
gr.Dropdown(
["Logic Only", "Logic + Backtracking"],
label="Select Solve Method",
value="Logic Only"
)
],
outputs=gr.Code(label="Solved Sudoku Grid", lines=12),
title="Sudoku Solver (Logic + Optional Backtracking)",
description="Enter 81 digits (0 for blanks). Choose logic-only or full solve with backtracking."
).launch(share=True)