Spaces:
Sleeping
Sleeping
| 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) | |