def test_solve_easy_sudoku(): ss = SudokuSolver(SolverConstants.easy_sudoku) sudoku = ss.solve_sudoku() assert sudoku.is_solved()
class SudokuGui(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Sudoku Solver") self.widget_cells = [] self.window = QWidget(self) self._set_to_initial_layout() self.solver = SudokuSolver() def _replace_layout(self, layout): window = QWidget(self) window.setLayout(layout) self.window = window self.window.setFocus() self.setCentralWidget(self.window) def _set_to_initial_layout(self): self._replace_layout(self._get_initial_layout()) def _get_initial_layout(self): vertical_layout = QVBoxLayout() vertical_layout.setSpacing(0) vertical_layout.addStretch(1) self.widget_cells = [] for i in range(9): horizontal_layout = QHBoxLayout() horizontal_layout.setSpacing(0) horizontal_layout.addStretch(1) widget_row = [] for j in range(9): le = QLineEdit('') le.setMaxLength(1) le.setAlignment(Qt.AlignCenter) widget_row.append(le) horizontal_layout.addWidget(widget_row[-1]) vertical_layout.addLayout(horizontal_layout) self.widget_cells.append(widget_row) vertical_layout.addWidget(self._get_solve_button()) return vertical_layout def _get_solve_button(self): solve_button = QPushButton('Solve') solve_button.clicked.connect(self._solve) return solve_button def get_window(self): return self.window def _encode(self): puzzle_encoding = [] for widget_row in self.widget_cells: new_row = [] for cell in widget_row: text = cell.text() if text in list(map(str, range(1, 9 + 1))): new_row.append(int(text)) else: new_row.append(None) puzzle_encoding.append(new_row) return puzzle_encoding def _display_solution(self, solution): vertical_layout = QVBoxLayout() for row in solution: horizontal_layout = QHBoxLayout() for cell in row: le = QLineEdit(str(cell)) le.setReadOnly(True) horizontal_layout.addWidget(le) vertical_layout.addLayout(horizontal_layout) new_puzzle_btn = QPushButton('New Puzzle!') new_puzzle_btn.clicked.connect(self._set_to_initial_layout) vertical_layout.addWidget(new_puzzle_btn) self._replace_layout(vertical_layout) def _solve(self): puzzle_encoding = self._encode() print("Solving...") if not self.solver.is_valid_sudoku(puzzle_encoding): QMessageBox.about(self, "Invalid", "Please enter a valid puzzle") return solved_puzzle, solved = self.solver.solve_sudoku(puzzle_encoding) if not solved: QMessageBox.about(self, "Unsolvable", "Can't solve this puzzle! Try again") return self._display_solution(solved_puzzle)
if __name__ == "__main__": sudoku_path = "../data/100_25.txt" sample_size = 10 #centroid_sudokus = read_line_sudoku_file(sudoku_path, sudoku_class=CentroidSudoku) #sasc = SpatialAnalysisSudokuCollection(centroid_sudokus, precision=2) entropy_sudokus = read_line_sudoku_file(sudoku_path) esc = EntropySudokuCollection(entropy_sudokus, precision=2) eval_sudokus = random.sample(list(esc.entropy_sudokus.values()), sample_size) solver = SudokuSolver() dispersions, conflicts = [], [] counter = 0 for sudoku in eval_sudokus: counter += 1 dispersions.append(sudoku.metric) conflicts.append(solver.solve_sudoku(sudoku)["conflicts"]) print("\rEvaluating {} {}...".format(counter, sudoku.__class__.__name__ + "s"), end="", flush=True) plt.scatter(dispersions, conflicts, marker=".") plt.show()