def forward_checking(assignments): assigned = [i for i in assignments if isinstance(assignments[i], int)] for x, y in assigned: for pos in assignments: if pos in assigned: continue if pos[0] == x: try: assignments[pos].remove(assignments[(x, y)]) except ValueError: pass if pos[1] == y: try: assignments[pos].remove(assignments[(x, y)]) except ValueError: pass region = SudokuBoard.get_region((x, y)) if pos in SudokuBoard.get_positions(region): try: assignments[pos].remove(assignments[(x, y)]) except ValueError: pass
def test_general_zone_clauses(self): board = SudokuBoard([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]) result = exactly_one_clauses(board.zones(), board.cell_width) cnf = sorted([str(c) for c in result]) expected = [ "!d1_1_1 || !d1_1_2", "!d1_1_1 || !d1_2_1", "!d1_1_1 || !d1_2_2", "!d1_1_2 || !d1_2_1", "!d1_1_2 || !d1_2_2", "!d1_1_3 || !d1_1_4", "!d1_1_3 || !d1_2_3", "!d1_1_3 || !d1_2_4", "!d1_1_4 || !d1_2_3", "!d1_1_4 || !d1_2_4", "!d1_2_1 || !d1_2_2", "!d1_2_3 || !d1_2_4", "!d1_3_1 || !d1_3_2", "!d1_3_1 || !d1_4_1", "!d1_3_1 || !d1_4_2", "!d1_3_2 || !d1_4_1", "!d1_3_2 || !d1_4_2", "!d1_3_3 || !d1_3_4", "!d1_3_3 || !d1_4_3", "!d1_3_3 || !d1_4_4", "!d1_3_4 || !d1_4_3", "!d1_3_4 || !d1_4_4", "!d1_4_1 || !d1_4_2", "!d1_4_3 || !d1_4_4", "!d2_1_1 || !d2_1_2", "!d2_1_1 || !d2_2_1", "!d2_1_1 || !d2_2_2", "!d2_1_2 || !d2_2_1", "!d2_1_2 || !d2_2_2", "!d2_1_3 || !d2_1_4", "!d2_1_3 || !d2_2_3", "!d2_1_3 || !d2_2_4", "!d2_1_4 || !d2_2_3", "!d2_1_4 || !d2_2_4", "!d2_2_1 || !d2_2_2", "!d2_2_3 || !d2_2_4", "!d2_3_1 || !d2_3_2", "!d2_3_1 || !d2_4_1", "!d2_3_1 || !d2_4_2", "!d2_3_2 || !d2_4_1", "!d2_3_2 || !d2_4_2", "!d2_3_3 || !d2_3_4", "!d2_3_3 || !d2_4_3", "!d2_3_3 || !d2_4_4", "!d2_3_4 || !d2_4_3", "!d2_3_4 || !d2_4_4", "!d2_4_1 || !d2_4_2", "!d2_4_3 || !d2_4_4", "!d3_1_1 || !d3_1_2", "!d3_1_1 || !d3_2_1", "!d3_1_1 || !d3_2_2", "!d3_1_2 || !d3_2_1", "!d3_1_2 || !d3_2_2", "!d3_1_3 || !d3_1_4", "!d3_1_3 || !d3_2_3", "!d3_1_3 || !d3_2_4", "!d3_1_4 || !d3_2_3", "!d3_1_4 || !d3_2_4", "!d3_2_1 || !d3_2_2", "!d3_2_3 || !d3_2_4", "!d3_3_1 || !d3_3_2", "!d3_3_1 || !d3_4_1", "!d3_3_1 || !d3_4_2", "!d3_3_2 || !d3_4_1", "!d3_3_2 || !d3_4_2", "!d3_3_3 || !d3_3_4", "!d3_3_3 || !d3_4_3", "!d3_3_3 || !d3_4_4", "!d3_3_4 || !d3_4_3", "!d3_3_4 || !d3_4_4", "!d3_4_1 || !d3_4_2", "!d3_4_3 || !d3_4_4", "!d4_1_1 || !d4_1_2", "!d4_1_1 || !d4_2_1", "!d4_1_1 || !d4_2_2", "!d4_1_2 || !d4_2_1", "!d4_1_2 || !d4_2_2", "!d4_1_3 || !d4_1_4", "!d4_1_3 || !d4_2_3", "!d4_1_3 || !d4_2_4", "!d4_1_4 || !d4_2_3", "!d4_1_4 || !d4_2_4", "!d4_2_1 || !d4_2_2", "!d4_2_3 || !d4_2_4", "!d4_3_1 || !d4_3_2", "!d4_3_1 || !d4_4_1", "!d4_3_1 || !d4_4_2", "!d4_3_2 || !d4_4_1", "!d4_3_2 || !d4_4_2", "!d4_3_3 || !d4_3_4", "!d4_3_3 || !d4_4_3", "!d4_3_3 || !d4_4_4", "!d4_3_4 || !d4_4_3", "!d4_3_4 || !d4_4_4", "!d4_4_1 || !d4_4_2", "!d4_4_3 || !d4_4_4", "d1_1_1 || d1_1_2 || d1_2_1 || d1_2_2", "d1_1_3 || d1_1_4 || d1_2_3 || d1_2_4", "d1_3_1 || d1_3_2 || d1_4_1 || d1_4_2", "d1_3_3 || d1_3_4 || d1_4_3 || d1_4_4", "d2_1_1 || d2_1_2 || d2_2_1 || d2_2_2", "d2_1_3 || d2_1_4 || d2_2_3 || d2_2_4", "d2_3_1 || d2_3_2 || d2_4_1 || d2_4_2", "d2_3_3 || d2_3_4 || d2_4_3 || d2_4_4", "d3_1_1 || d3_1_2 || d3_2_1 || d3_2_2", "d3_1_3 || d3_1_4 || d3_2_3 || d3_2_4", "d3_3_1 || d3_3_2 || d3_4_1 || d3_4_2", "d3_3_3 || d3_3_4 || d3_4_3 || d3_4_4", "d4_1_1 || d4_1_2 || d4_2_1 || d4_2_2", "d4_1_3 || d4_1_4 || d4_2_3 || d4_2_4", "d4_3_1 || d4_3_2 || d4_4_1 || d4_4_2", "d4_3_3 || d4_3_4 || d4_4_3 || d4_4_4" ] assert cnf == expected
def test_contents1(self): board = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 0, 0]]) expected = { cnf.c('d3_1_4'), cnf.c('d2_2_4'), cnf.c('d3_3_1'), cnf.c('d4_4_1') } assert set(board.contents()) == expected
def get_board(self): matrices = [box.as_matrix() for box in self.boxes] row1 = matrices[0][0] + matrices[1][0] row2 = matrices[0][1] + matrices[1][1] row3 = matrices[2][0] + matrices[3][0] row4 = matrices[2][1] + matrices[3][1] return SudokuBoard([row1, row2, row3, row4])
def main(): # Process command line args parser = argparse.ArgumentParser(description="Sudoku Solver args", usage="Usage: {} " "<puzzle file name>".format( os.path.split(sys.argv[0])[1]), prog=os.path.split(sys.argv[0])[1]) parser.add_argument('--debug', dest='debug', default=False, action='store_true') parser.add_argument('file_name') args = parser.parse_args() file_name = args.file_name with open(file_name) as puzzle_file: # Read nine lines data = [puzzle_file.readline().strip() for i in range(9)] puzzle = SudokuBoard(itertools.chain(*data)) print('PUZZLE:') print(puzzle) print() if sudokusolver.solve(puzzle, args.debug): print('SOLUTION:') print(puzzle) else: print('Could not find a solution')
def test_board(self): board = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 0, 0]]) expected = "\n".join(["0003", "0002", "3000", "4000"]) assert str(board) == expected expected = [[(1, 1), (1, 2), (1, 3), (1, 4)], [(2, 1), (2, 2), (2, 3), (2, 4)], [(3, 1), (3, 2), (3, 3), (3, 4)], [(4, 1), (4, 2), (4, 3), (4, 4)]] assert board.rows() == expected expected = [[(1, 1), (2, 1), (3, 1), (4, 1)], [(1, 2), (2, 2), (3, 2), (4, 2)], [(1, 3), (2, 3), (3, 3), (4, 3)], [(1, 4), (2, 4), (3, 4), (4, 4)]] assert board.columns() == expected expected = [[(1, 1), (1, 2), (2, 1), (2, 2)], [(1, 3), (1, 4), (2, 3), (2, 4)], [(3, 1), (3, 2), (4, 1), (4, 2)], [(3, 3), (3, 4), (4, 3), (4, 4)]] assert board.zones() == expected
def test_solve(self): board = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 0, 0]]) solved = board.solve(SearchSolver()) expected = '\n'.join(['2413', '1342', '3124', '4231']) assert str(solved) == expected
from sudoku import SudokuBoard from boardui import BoardGUI import tkinter as tk from strategy import StrategyMk1, StrategyMk2, StrategyMk3 from newstrat import strategymk4 import utilities board = utilities.generate_puzzle_matrix(3) game = SudokuBoard(board, 3) window = tk.Tk() BoardGUI(window,game ) tk.mainloop()
#!/usr/bin/python from sudoku import SudokuBoard boards = ["board" + str(i) + ".txt" for i in range(1,6)] for fn in boards: print("============ " + fn + ":") board = SudokuBoard(fn) print("Before:") board.printBoard() result = board.AC_3(False) print("\nAfter AC-3:") board.printBoard() print("Solved: " + str(board.isSolved())) print("\nAfter AC-3 with extra inference:") board = SudokuBoard(fn) result = board.AC_3(True) board.printBoard() print("Solved: " + str(board.isSolved()))
def test_get_initial_list(self): board = SudokuBoard(9) expected_result = [1, 2, 3, 4, 5, 6, 7, 8, 9] self.assertEqual(board._get_initial_list(), expected_result)
def test_cnf(self): board0 = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 0, 0]]) expected = ['!d1_1_1 || !d1_1_2', '!d1_1_1 || !d1_1_3', '!d1_1_1 || !d1_1_4', '!d1_1_1 || !d1_2_1', '!d1_1_1 || !d1_2_2', '!d1_1_1 || !d1_3_1', '!d1_1_1 || !d1_4_1', '!d1_1_2 || !d1_1_3', '!d1_1_2 || !d1_1_4', '!d1_1_2 || !d1_2_1', '!d1_1_2 || !d1_2_2', '!d1_1_2 || !d1_3_2', '!d1_1_2 || !d1_4_2', '!d1_1_3 || !d1_1_4', '!d1_1_3 || !d1_2_3', '!d1_1_3 || !d1_2_4', '!d1_1_3 || !d1_3_3', '!d1_1_3 || !d1_4_3', '!d1_1_4 || !d1_2_3', '!d1_1_4 || !d1_2_4', '!d1_1_4 || !d1_3_4', '!d1_1_4 || !d1_4_4', '!d1_2_1 || !d1_2_2', '!d1_2_1 || !d1_2_3', '!d1_2_1 || !d1_2_4', '!d1_2_1 || !d1_3_1', '!d1_2_1 || !d1_4_1', '!d1_2_2 || !d1_2_3', '!d1_2_2 || !d1_2_4', '!d1_2_2 || !d1_3_2', '!d1_2_2 || !d1_4_2', '!d1_2_3 || !d1_2_4', '!d1_2_3 || !d1_3_3', '!d1_2_3 || !d1_4_3', '!d1_2_4 || !d1_3_4', '!d1_2_4 || !d1_4_4', '!d1_3_1 || !d1_3_2', '!d1_3_1 || !d1_3_3', '!d1_3_1 || !d1_3_4', '!d1_3_1 || !d1_4_1', '!d1_3_1 || !d1_4_2', '!d1_3_2 || !d1_3_3', '!d1_3_2 || !d1_3_4', '!d1_3_2 || !d1_4_1', '!d1_3_2 || !d1_4_2', '!d1_3_3 || !d1_3_4', '!d1_3_3 || !d1_4_3', '!d1_3_3 || !d1_4_4', '!d1_3_4 || !d1_4_3', '!d1_3_4 || !d1_4_4', '!d1_4_1 || !d1_4_2', '!d1_4_1 || !d1_4_3', '!d1_4_1 || !d1_4_4', '!d1_4_2 || !d1_4_3', '!d1_4_2 || !d1_4_4', '!d1_4_3 || !d1_4_4', '!d2_1_1 || !d2_1_2', '!d2_1_1 || !d2_1_3', '!d2_1_1 || !d2_1_4', '!d2_1_1 || !d2_2_1', '!d2_1_1 || !d2_2_2', '!d2_1_1 || !d2_3_1', '!d2_1_1 || !d2_4_1', '!d2_1_2 || !d2_1_3', '!d2_1_2 || !d2_1_4', '!d2_1_2 || !d2_2_1', '!d2_1_2 || !d2_2_2', '!d2_1_2 || !d2_3_2', '!d2_1_2 || !d2_4_2', '!d2_1_3 || !d2_1_4', '!d2_1_3 || !d2_2_3', '!d2_1_3 || !d2_2_4', '!d2_1_3 || !d2_3_3', '!d2_1_3 || !d2_4_3', '!d2_1_4 || !d2_2_3', '!d2_1_4 || !d2_2_4', '!d2_1_4 || !d2_3_4', '!d2_1_4 || !d2_4_4', '!d2_2_1 || !d2_2_2', '!d2_2_1 || !d2_2_3', '!d2_2_1 || !d2_2_4', '!d2_2_1 || !d2_3_1', '!d2_2_1 || !d2_4_1', '!d2_2_2 || !d2_2_3', '!d2_2_2 || !d2_2_4', '!d2_2_2 || !d2_3_2', '!d2_2_2 || !d2_4_2', '!d2_2_3 || !d2_2_4', '!d2_2_3 || !d2_3_3', '!d2_2_3 || !d2_4_3', '!d2_2_4 || !d2_3_4', '!d2_2_4 || !d2_4_4', '!d2_3_1 || !d2_3_2', '!d2_3_1 || !d2_3_3', '!d2_3_1 || !d2_3_4', '!d2_3_1 || !d2_4_1', '!d2_3_1 || !d2_4_2', '!d2_3_2 || !d2_3_3', '!d2_3_2 || !d2_3_4', '!d2_3_2 || !d2_4_1', '!d2_3_2 || !d2_4_2', '!d2_3_3 || !d2_3_4', '!d2_3_3 || !d2_4_3', '!d2_3_3 || !d2_4_4', '!d2_3_4 || !d2_4_3', '!d2_3_4 || !d2_4_4', '!d2_4_1 || !d2_4_2', '!d2_4_1 || !d2_4_3', '!d2_4_1 || !d2_4_4', '!d2_4_2 || !d2_4_3', '!d2_4_2 || !d2_4_4', '!d2_4_3 || !d2_4_4', '!d3_1_1 || !d3_1_2', '!d3_1_1 || !d3_1_3', '!d3_1_1 || !d3_1_4', '!d3_1_1 || !d3_2_1', '!d3_1_1 || !d3_2_2', '!d3_1_1 || !d3_3_1', '!d3_1_1 || !d3_4_1', '!d3_1_2 || !d3_1_3', '!d3_1_2 || !d3_1_4', '!d3_1_2 || !d3_2_1', '!d3_1_2 || !d3_2_2', '!d3_1_2 || !d3_3_2', '!d3_1_2 || !d3_4_2', '!d3_1_3 || !d3_1_4', '!d3_1_3 || !d3_2_3', '!d3_1_3 || !d3_2_4', '!d3_1_3 || !d3_3_3', '!d3_1_3 || !d3_4_3', '!d3_1_4 || !d3_2_3', '!d3_1_4 || !d3_2_4', '!d3_1_4 || !d3_3_4', '!d3_1_4 || !d3_4_4', '!d3_2_1 || !d3_2_2', '!d3_2_1 || !d3_2_3', '!d3_2_1 || !d3_2_4', '!d3_2_1 || !d3_3_1', '!d3_2_1 || !d3_4_1', '!d3_2_2 || !d3_2_3', '!d3_2_2 || !d3_2_4', '!d3_2_2 || !d3_3_2', '!d3_2_2 || !d3_4_2', '!d3_2_3 || !d3_2_4', '!d3_2_3 || !d3_3_3', '!d3_2_3 || !d3_4_3', '!d3_2_4 || !d3_3_4', '!d3_2_4 || !d3_4_4', '!d3_3_1 || !d3_3_2', '!d3_3_1 || !d3_3_3', '!d3_3_1 || !d3_3_4', '!d3_3_1 || !d3_4_1', '!d3_3_1 || !d3_4_2', '!d3_3_2 || !d3_3_3', '!d3_3_2 || !d3_3_4', '!d3_3_2 || !d3_4_1', '!d3_3_2 || !d3_4_2', '!d3_3_3 || !d3_3_4', '!d3_3_3 || !d3_4_3', '!d3_3_3 || !d3_4_4', '!d3_3_4 || !d3_4_3', '!d3_3_4 || !d3_4_4', '!d3_4_1 || !d3_4_2', '!d3_4_1 || !d3_4_3', '!d3_4_1 || !d3_4_4', '!d3_4_2 || !d3_4_3', '!d3_4_2 || !d3_4_4', '!d3_4_3 || !d3_4_4', '!d4_1_1 || !d4_1_2', '!d4_1_1 || !d4_1_3', '!d4_1_1 || !d4_1_4', '!d4_1_1 || !d4_2_1', '!d4_1_1 || !d4_2_2', '!d4_1_1 || !d4_3_1', '!d4_1_1 || !d4_4_1', '!d4_1_2 || !d4_1_3', '!d4_1_2 || !d4_1_4', '!d4_1_2 || !d4_2_1', '!d4_1_2 || !d4_2_2', '!d4_1_2 || !d4_3_2', '!d4_1_2 || !d4_4_2', '!d4_1_3 || !d4_1_4', '!d4_1_3 || !d4_2_3', '!d4_1_3 || !d4_2_4', '!d4_1_3 || !d4_3_3', '!d4_1_3 || !d4_4_3', '!d4_1_4 || !d4_2_3', '!d4_1_4 || !d4_2_4', '!d4_1_4 || !d4_3_4', '!d4_1_4 || !d4_4_4', '!d4_2_1 || !d4_2_2', '!d4_2_1 || !d4_2_3', '!d4_2_1 || !d4_2_4', '!d4_2_1 || !d4_3_1', '!d4_2_1 || !d4_4_1', '!d4_2_2 || !d4_2_3', '!d4_2_2 || !d4_2_4', '!d4_2_2 || !d4_3_2', '!d4_2_2 || !d4_4_2', '!d4_2_3 || !d4_2_4', '!d4_2_3 || !d4_3_3', '!d4_2_3 || !d4_4_3', '!d4_2_4 || !d4_3_4', '!d4_2_4 || !d4_4_4', '!d4_3_1 || !d4_3_2', '!d4_3_1 || !d4_3_3', '!d4_3_1 || !d4_3_4', '!d4_3_1 || !d4_4_1', '!d4_3_1 || !d4_4_2', '!d4_3_2 || !d4_3_3', '!d4_3_2 || !d4_3_4', '!d4_3_2 || !d4_4_1', '!d4_3_2 || !d4_4_2', '!d4_3_3 || !d4_3_4', '!d4_3_3 || !d4_4_3', '!d4_3_3 || !d4_4_4', '!d4_3_4 || !d4_4_3', '!d4_3_4 || !d4_4_4', '!d4_4_1 || !d4_4_2', '!d4_4_1 || !d4_4_3', '!d4_4_1 || !d4_4_4', '!d4_4_2 || !d4_4_3', '!d4_4_2 || !d4_4_4', '!d4_4_3 || !d4_4_4', "d1_1_1 || d1_1_2 || d1_1_3 || d1_1_4", "d1_1_1 || d1_1_2 || d1_2_1 || d1_2_2", "d1_1_1 || d1_2_1 || d1_3_1 || d1_4_1", "d1_1_1 || d2_1_1 || d3_1_1 || d4_1_1", "d1_1_2 || d1_2_2 || d1_3_2 || d1_4_2", "d1_1_2 || d2_1_2 || d3_1_2 || d4_1_2", "d1_1_3 || d1_1_4 || d1_2_3 || d1_2_4", "d1_1_3 || d1_2_3 || d1_3_3 || d1_4_3", "d1_1_3 || d2_1_3 || d3_1_3 || d4_1_3", "d1_1_4 || d1_2_4 || d1_3_4 || d1_4_4", "d1_1_4 || d2_1_4 || d3_1_4 || d4_1_4", "d1_2_1 || d1_2_2 || d1_2_3 || d1_2_4", "d1_2_1 || d2_2_1 || d3_2_1 || d4_2_1", "d1_2_2 || d2_2_2 || d3_2_2 || d4_2_2", "d1_2_3 || d2_2_3 || d3_2_3 || d4_2_3", "d1_2_4 || d2_2_4 || d3_2_4 || d4_2_4", "d1_3_1 || d1_3_2 || d1_3_3 || d1_3_4", "d1_3_1 || d1_3_2 || d1_4_1 || d1_4_2", "d1_3_1 || d2_3_1 || d3_3_1 || d4_3_1", "d1_3_2 || d2_3_2 || d3_3_2 || d4_3_2", "d1_3_3 || d1_3_4 || d1_4_3 || d1_4_4", "d1_3_3 || d2_3_3 || d3_3_3 || d4_3_3", "d1_3_4 || d2_3_4 || d3_3_4 || d4_3_4", "d1_4_1 || d1_4_2 || d1_4_3 || d1_4_4", "d1_4_1 || d2_4_1 || d3_4_1 || d4_4_1", "d1_4_2 || d2_4_2 || d3_4_2 || d4_4_2", "d1_4_3 || d2_4_3 || d3_4_3 || d4_4_3", "d1_4_4 || d2_4_4 || d3_4_4 || d4_4_4", "d2_1_1 || d2_1_2 || d2_1_3 || d2_1_4", "d2_1_1 || d2_1_2 || d2_2_1 || d2_2_2", "d2_1_1 || d2_2_1 || d2_3_1 || d2_4_1", "d2_1_2 || d2_2_2 || d2_3_2 || d2_4_2", "d2_1_3 || d2_1_4 || d2_2_3 || d2_2_4", "d2_1_3 || d2_2_3 || d2_3_3 || d2_4_3", "d2_1_4 || d2_2_4 || d2_3_4 || d2_4_4", "d2_2_1 || d2_2_2 || d2_2_3 || d2_2_4", "d2_2_4", "d2_3_1 || d2_3_2 || d2_3_3 || d2_3_4", "d2_3_1 || d2_3_2 || d2_4_1 || d2_4_2", "d2_3_3 || d2_3_4 || d2_4_3 || d2_4_4", "d2_4_1 || d2_4_2 || d2_4_3 || d2_4_4", "d3_1_1 || d3_1_2 || d3_1_3 || d3_1_4", "d3_1_1 || d3_1_2 || d3_2_1 || d3_2_2", "d3_1_1 || d3_2_1 || d3_3_1 || d3_4_1", "d3_1_2 || d3_2_2 || d3_3_2 || d3_4_2", "d3_1_3 || d3_1_4 || d3_2_3 || d3_2_4", "d3_1_3 || d3_2_3 || d3_3_3 || d3_4_3", "d3_1_4", "d3_1_4 || d3_2_4 || d3_3_4 || d3_4_4", "d3_2_1 || d3_2_2 || d3_2_3 || d3_2_4", "d3_3_1", "d3_3_1 || d3_3_2 || d3_3_3 || d3_3_4", "d3_3_1 || d3_3_2 || d3_4_1 || d3_4_2", "d3_3_3 || d3_3_4 || d3_4_3 || d3_4_4", "d3_4_1 || d3_4_2 || d3_4_3 || d3_4_4", "d4_1_1 || d4_1_2 || d4_1_3 || d4_1_4", "d4_1_1 || d4_1_2 || d4_2_1 || d4_2_2", "d4_1_1 || d4_2_1 || d4_3_1 || d4_4_1", "d4_1_2 || d4_2_2 || d4_3_2 || d4_4_2", "d4_1_3 || d4_1_4 || d4_2_3 || d4_2_4", "d4_1_3 || d4_2_3 || d4_3_3 || d4_4_3", "d4_1_4 || d4_2_4 || d4_3_4 || d4_4_4", "d4_2_1 || d4_2_2 || d4_2_3 || d4_2_4", "d4_3_1 || d4_3_2 || d4_3_3 || d4_3_4", "d4_3_1 || d4_3_2 || d4_4_1 || d4_4_2", "d4_3_3 || d4_3_4 || d4_4_3 || d4_4_4", "d4_4_1", "d4_4_1 || d4_4_2 || d4_4_3 || d4_4_4"] assert '\n'.join(expected) == str(board0.cnf())
#!/usr/bin/python import sys import pygame from sudoku import SudokuBoard width = 542 height = 600 step = width / 9 pygame.init() pygame.font.init() window = pygame.display.set_mode((width, height)) myboard = SudokuBoard() while myboard.gameOn: myboard.boardEvents()
assignments[pos].remove(assignments[(x, y)]) except ValueError: pass if __name__ == '__main__': board = ("0 7 0 4 0 0 3 0 0\n" "0 0 0 0 9 0 1 2 0\n" "0 0 0 7 0 0 0 0 5\n" "0 0 9 2 0 0 0 0 8\n" "8 0 0 6 0 9 0 0 4\n" "7 0 0 0 0 8 9 0 0\n" "3 0 0 0 0 5 0 0 0\n" "0 2 5 0 4 0 0 0 0\n" "0 0 7 0 0 3 0 6 0\n") sudoku = SudokuBoard(board) assignments = sudoku.get_board() for i in product(range(1, 10), range(1, 10)): if i not in assignments: assignments[i] = range(1, 10) forward_checking(assignments) result = search(sudoku, assignments) if result is None: print '' else: print result
#!/usr/bin/python import sys from sudoku import SudokuBoard class WritableObject: def __init__(self): self.content = "" def write(self, string): self.content = self.content + string boardObj = SudokuBoard('sudoku-board.txt') output = WritableObject() sys.stdout = output boardObj.printBoard() sys.stdout = sys.__stdout__ assert(output.content == "* 1 * | 4 2 * | * * 5\n* * 2 | * 7 1 | * 3 9\n* * * | * * * | * 4 *\n-------+---------+-------\n2 * 7 | 1 * * | * * 6\n* * * | * 4 * | * * *\n6 * * | * * 7 | 4 * 3\n-------+---------+-------\n* 7 * | * * * | * * *\n1 2 * | 7 3 * | 5 * *\n3 * * | * 8 2 | * 7 *\n") constraints = boardObj.getConstraintSets((1,0)) unuseds = [] for i in range(0,3): unuseds.append(boardObj.computeUnusedNums(constraints[i])) assert(set([4,5,6,8]) in unuseds) assert(set([4,5,7,8,9]) in unuseds) assert(set(range(3,10)) in unuseds) assert(len(unuseds) == 3) assert(not boardObj.isSolved()) print 'All tests passed'
def test_get_playable_board(self): """should not equal board""" board = SudokuBoard(9) playable_board = board.get_playable_board() self.assertNotEqual(playable_board, board.board)
def test_get_full_board(self): board = SudokuBoard(4).get_full_board() non_expected_result = [[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]] self.assertNotEqual(board, non_expected_result)
def test_get_initial_matrix(self): board = SudokuBoard(4).get_initial_matrix() expected_result = [[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]] self.assertEqual(board, expected_result)
def test_board_list(self): board = SudokuBoard(16) expected_result = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G' ] self.assertEqual(board.board_list, expected_result)
def test_constraints(self): board0 = SudokuBoard([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]) #cnf = sorted([str(c) for c in board0.cnf()]) expected = [ "!d1_1_1 || !d1_1_2", "!d1_1_1 || !d1_1_2", "!d1_1_1 || !d1_1_3", "!d1_1_1 || !d1_1_4", "!d1_1_1 || !d1_2_1", "!d1_1_1 || !d1_2_1", "!d1_1_1 || !d1_2_2", "!d1_1_1 || !d1_3_1", "!d1_1_1 || !d1_4_1", "!d1_1_2 || !d1_1_3", "!d1_1_2 || !d1_1_4", "!d1_1_2 || !d1_2_1", "!d1_1_2 || !d1_2_2", "!d1_1_2 || !d1_2_2", "!d1_1_2 || !d1_3_2", "!d1_1_2 || !d1_4_2", "!d1_1_3 || !d1_1_4", "!d1_1_3 || !d1_1_4", "!d1_1_3 || !d1_2_3", "!d1_1_3 || !d1_2_3", "!d1_1_3 || !d1_2_4", "!d1_1_3 || !d1_3_3", "!d1_1_3 || !d1_4_3", "!d1_1_4 || !d1_2_3", "!d1_1_4 || !d1_2_4", "!d1_1_4 || !d1_2_4", "!d1_1_4 || !d1_3_4", "!d1_1_4 || !d1_4_4", "!d1_2_1 || !d1_2_2", "!d1_2_1 || !d1_2_2", "!d1_2_1 || !d1_2_3", "!d1_2_1 || !d1_2_4", "!d1_2_1 || !d1_3_1", "!d1_2_1 || !d1_4_1", "!d1_2_2 || !d1_2_3", "!d1_2_2 || !d1_2_4", "!d1_2_2 || !d1_3_2", "!d1_2_2 || !d1_4_2", "!d1_2_3 || !d1_2_4", "!d1_2_3 || !d1_2_4", "!d1_2_3 || !d1_3_3", "!d1_2_3 || !d1_4_3", "!d1_2_4 || !d1_3_4", "!d1_2_4 || !d1_4_4", "!d1_3_1 || !d1_3_2", "!d1_3_1 || !d1_3_2", "!d1_3_1 || !d1_3_3", "!d1_3_1 || !d1_3_4", "!d1_3_1 || !d1_4_1", "!d1_3_1 || !d1_4_1", "!d1_3_1 || !d1_4_2", "!d1_3_2 || !d1_3_3", "!d1_3_2 || !d1_3_4", "!d1_3_2 || !d1_4_1", "!d1_3_2 || !d1_4_2", "!d1_3_2 || !d1_4_2", "!d1_3_3 || !d1_3_4", "!d1_3_3 || !d1_3_4", "!d1_3_3 || !d1_4_3", "!d1_3_3 || !d1_4_3", "!d1_3_3 || !d1_4_4", "!d1_3_4 || !d1_4_3", "!d1_3_4 || !d1_4_4", "!d1_3_4 || !d1_4_4", "!d1_4_1 || !d1_4_2", "!d1_4_1 || !d1_4_2", "!d1_4_1 || !d1_4_3", "!d1_4_1 || !d1_4_4", "!d1_4_2 || !d1_4_3", "!d1_4_2 || !d1_4_4", "!d1_4_3 || !d1_4_4", "!d1_4_3 || !d1_4_4", "!d2_1_1 || !d2_1_2", "!d2_1_1 || !d2_1_2", "!d2_1_1 || !d2_1_3", "!d2_1_1 || !d2_1_4", "!d2_1_1 || !d2_2_1", "!d2_1_1 || !d2_2_1", "!d2_1_1 || !d2_2_2", "!d2_1_1 || !d2_3_1", "!d2_1_1 || !d2_4_1", "!d2_1_2 || !d2_1_3", "!d2_1_2 || !d2_1_4", "!d2_1_2 || !d2_2_1", "!d2_1_2 || !d2_2_2", "!d2_1_2 || !d2_2_2", "!d2_1_2 || !d2_3_2", "!d2_1_2 || !d2_4_2", "!d2_1_3 || !d2_1_4", "!d2_1_3 || !d2_1_4", "!d2_1_3 || !d2_2_3", "!d2_1_3 || !d2_2_3", "!d2_1_3 || !d2_2_4", "!d2_1_3 || !d2_3_3", "!d2_1_3 || !d2_4_3", "!d2_1_4 || !d2_2_3", "!d2_1_4 || !d2_2_4", "!d2_1_4 || !d2_2_4", "!d2_1_4 || !d2_3_4", "!d2_1_4 || !d2_4_4", "!d2_2_1 || !d2_2_2", "!d2_2_1 || !d2_2_2", "!d2_2_1 || !d2_2_3", "!d2_2_1 || !d2_2_4", "!d2_2_1 || !d2_3_1", "!d2_2_1 || !d2_4_1", "!d2_2_2 || !d2_2_3", "!d2_2_2 || !d2_2_4", "!d2_2_2 || !d2_3_2", "!d2_2_2 || !d2_4_2", "!d2_2_3 || !d2_2_4", "!d2_2_3 || !d2_2_4", "!d2_2_3 || !d2_3_3", "!d2_2_3 || !d2_4_3", "!d2_2_4 || !d2_3_4", "!d2_2_4 || !d2_4_4", "!d2_3_1 || !d2_3_2", "!d2_3_1 || !d2_3_2", "!d2_3_1 || !d2_3_3", "!d2_3_1 || !d2_3_4", "!d2_3_1 || !d2_4_1", "!d2_3_1 || !d2_4_1", "!d2_3_1 || !d2_4_2", "!d2_3_2 || !d2_3_3", "!d2_3_2 || !d2_3_4", "!d2_3_2 || !d2_4_1", "!d2_3_2 || !d2_4_2", "!d2_3_2 || !d2_4_2", "!d2_3_3 || !d2_3_4", "!d2_3_3 || !d2_3_4", "!d2_3_3 || !d2_4_3", "!d2_3_3 || !d2_4_3", "!d2_3_3 || !d2_4_4", "!d2_3_4 || !d2_4_3", "!d2_3_4 || !d2_4_4", "!d2_3_4 || !d2_4_4", "!d2_4_1 || !d2_4_2", "!d2_4_1 || !d2_4_2", "!d2_4_1 || !d2_4_3", "!d2_4_1 || !d2_4_4", "!d2_4_2 || !d2_4_3", "!d2_4_2 || !d2_4_4", "!d2_4_3 || !d2_4_4", "!d2_4_3 || !d2_4_4", "!d3_1_1 || !d3_1_2", "!d3_1_1 || !d3_1_2", "!d3_1_1 || !d3_1_3", "!d3_1_1 || !d3_1_4", "!d3_1_1 || !d3_2_1", "!d3_1_1 || !d3_2_1", "!d3_1_1 || !d3_2_2", "!d3_1_1 || !d3_3_1", "!d3_1_1 || !d3_4_1", "!d3_1_2 || !d3_1_3", "!d3_1_2 || !d3_1_4", "!d3_1_2 || !d3_2_1", "!d3_1_2 || !d3_2_2", "!d3_1_2 || !d3_2_2", "!d3_1_2 || !d3_3_2", "!d3_1_2 || !d3_4_2", "!d3_1_3 || !d3_1_4", "!d3_1_3 || !d3_1_4", "!d3_1_3 || !d3_2_3", "!d3_1_3 || !d3_2_3", "!d3_1_3 || !d3_2_4", "!d3_1_3 || !d3_3_3", "!d3_1_3 || !d3_4_3", "!d3_1_4 || !d3_2_3", "!d3_1_4 || !d3_2_4", "!d3_1_4 || !d3_2_4", "!d3_1_4 || !d3_3_4", "!d3_1_4 || !d3_4_4", "!d3_2_1 || !d3_2_2", "!d3_2_1 || !d3_2_2", "!d3_2_1 || !d3_2_3", "!d3_2_1 || !d3_2_4", "!d3_2_1 || !d3_3_1", "!d3_2_1 || !d3_4_1", "!d3_2_2 || !d3_2_3", "!d3_2_2 || !d3_2_4", "!d3_2_2 || !d3_3_2", "!d3_2_2 || !d3_4_2", "!d3_2_3 || !d3_2_4", "!d3_2_3 || !d3_2_4", "!d3_2_3 || !d3_3_3", "!d3_2_3 || !d3_4_3", "!d3_2_4 || !d3_3_4", "!d3_2_4 || !d3_4_4", "!d3_3_1 || !d3_3_2", "!d3_3_1 || !d3_3_2", "!d3_3_1 || !d3_3_3", "!d3_3_1 || !d3_3_4", "!d3_3_1 || !d3_4_1", "!d3_3_1 || !d3_4_1", "!d3_3_1 || !d3_4_2", "!d3_3_2 || !d3_3_3", "!d3_3_2 || !d3_3_4", "!d3_3_2 || !d3_4_1", "!d3_3_2 || !d3_4_2", "!d3_3_2 || !d3_4_2", "!d3_3_3 || !d3_3_4", "!d3_3_3 || !d3_3_4", "!d3_3_3 || !d3_4_3", "!d3_3_3 || !d3_4_3", "!d3_3_3 || !d3_4_4", "!d3_3_4 || !d3_4_3", "!d3_3_4 || !d3_4_4", "!d3_3_4 || !d3_4_4", "!d3_4_1 || !d3_4_2", "!d3_4_1 || !d3_4_2", "!d3_4_1 || !d3_4_3", "!d3_4_1 || !d3_4_4", "!d3_4_2 || !d3_4_3", "!d3_4_2 || !d3_4_4", "!d3_4_3 || !d3_4_4", "!d3_4_3 || !d3_4_4", "!d4_1_1 || !d4_1_2", "!d4_1_1 || !d4_1_2", "!d4_1_1 || !d4_1_3", "!d4_1_1 || !d4_1_4", "!d4_1_1 || !d4_2_1", "!d4_1_1 || !d4_2_1", "!d4_1_1 || !d4_2_2", "!d4_1_1 || !d4_3_1", "!d4_1_1 || !d4_4_1", "!d4_1_2 || !d4_1_3", "!d4_1_2 || !d4_1_4", "!d4_1_2 || !d4_2_1", "!d4_1_2 || !d4_2_2", "!d4_1_2 || !d4_2_2", "!d4_1_2 || !d4_3_2", "!d4_1_2 || !d4_4_2", "!d4_1_3 || !d4_1_4", "!d4_1_3 || !d4_1_4", "!d4_1_3 || !d4_2_3", "!d4_1_3 || !d4_2_3", "!d4_1_3 || !d4_2_4", "!d4_1_3 || !d4_3_3", "!d4_1_3 || !d4_4_3", "!d4_1_4 || !d4_2_3", "!d4_1_4 || !d4_2_4", "!d4_1_4 || !d4_2_4", "!d4_1_4 || !d4_3_4", "!d4_1_4 || !d4_4_4", "!d4_2_1 || !d4_2_2", "!d4_2_1 || !d4_2_2", "!d4_2_1 || !d4_2_3", "!d4_2_1 || !d4_2_4", "!d4_2_1 || !d4_3_1", "!d4_2_1 || !d4_4_1", "!d4_2_2 || !d4_2_3", "!d4_2_2 || !d4_2_4", "!d4_2_2 || !d4_3_2", "!d4_2_2 || !d4_4_2", "!d4_2_3 || !d4_2_4", "!d4_2_3 || !d4_2_4", "!d4_2_3 || !d4_3_3", "!d4_2_3 || !d4_4_3", "!d4_2_4 || !d4_3_4", "!d4_2_4 || !d4_4_4", "!d4_3_1 || !d4_3_2", "!d4_3_1 || !d4_3_2", "!d4_3_1 || !d4_3_3", "!d4_3_1 || !d4_3_4", "!d4_3_1 || !d4_4_1", "!d4_3_1 || !d4_4_1", "!d4_3_1 || !d4_4_2", "!d4_3_2 || !d4_3_3", "!d4_3_2 || !d4_3_4", "!d4_3_2 || !d4_4_1", "!d4_3_2 || !d4_4_2", "!d4_3_2 || !d4_4_2", "!d4_3_3 || !d4_3_4", "!d4_3_3 || !d4_3_4", "!d4_3_3 || !d4_4_3", "!d4_3_3 || !d4_4_3", "!d4_3_3 || !d4_4_4", "!d4_3_4 || !d4_4_3", "!d4_3_4 || !d4_4_4", "!d4_3_4 || !d4_4_4", "!d4_4_1 || !d4_4_2", "!d4_4_1 || !d4_4_2", "!d4_4_1 || !d4_4_3", "!d4_4_1 || !d4_4_4", "!d4_4_2 || !d4_4_3", "!d4_4_2 || !d4_4_4", "!d4_4_3 || !d4_4_4", "!d4_4_3 || !d4_4_4", "d1_1_1 || d1_1_2 || d1_1_3 || d1_1_4", "d1_1_1 || d1_1_2 || d1_2_1 || d1_2_2", "d1_1_1 || d1_2_1 || d1_3_1 || d1_4_1", "d1_1_1 || d2_1_1 || d3_1_1 || d4_1_1", "d1_1_2 || d1_2_2 || d1_3_2 || d1_4_2", "d1_1_2 || d2_1_2 || d3_1_2 || d4_1_2", "d1_1_3 || d1_1_4 || d1_2_3 || d1_2_4", "d1_1_3 || d1_2_3 || d1_3_3 || d1_4_3", "d1_1_3 || d2_1_3 || d3_1_3 || d4_1_3", "d1_1_4 || d1_2_4 || d1_3_4 || d1_4_4", "d1_1_4 || d2_1_4 || d3_1_4 || d4_1_4", "d1_2_1 || d1_2_2 || d1_2_3 || d1_2_4", "d1_2_1 || d2_2_1 || d3_2_1 || d4_2_1", "d1_2_2 || d2_2_2 || d3_2_2 || d4_2_2", "d1_2_3 || d2_2_3 || d3_2_3 || d4_2_3", "d1_2_4 || d2_2_4 || d3_2_4 || d4_2_4", "d1_3_1 || d1_3_2 || d1_3_3 || d1_3_4", "d1_3_1 || d1_3_2 || d1_4_1 || d1_4_2", "d1_3_1 || d2_3_1 || d3_3_1 || d4_3_1", "d1_3_2 || d2_3_2 || d3_3_2 || d4_3_2", "d1_3_3 || d1_3_4 || d1_4_3 || d1_4_4", "d1_3_3 || d2_3_3 || d3_3_3 || d4_3_3", "d1_3_4 || d2_3_4 || d3_3_4 || d4_3_4", "d1_4_1 || d1_4_2 || d1_4_3 || d1_4_4", "d1_4_1 || d2_4_1 || d3_4_1 || d4_4_1", "d1_4_2 || d2_4_2 || d3_4_2 || d4_4_2", "d1_4_3 || d2_4_3 || d3_4_3 || d4_4_3", "d1_4_4 || d2_4_4 || d3_4_4 || d4_4_4", "d2_1_1 || d2_1_2 || d2_1_3 || d2_1_4", "d2_1_1 || d2_1_2 || d2_2_1 || d2_2_2", "d2_1_1 || d2_2_1 || d2_3_1 || d2_4_1", "d2_1_2 || d2_2_2 || d2_3_2 || d2_4_2", "d2_1_3 || d2_1_4 || d2_2_3 || d2_2_4", "d2_1_3 || d2_2_3 || d2_3_3 || d2_4_3", "d2_1_4 || d2_2_4 || d2_3_4 || d2_4_4", "d2_2_1 || d2_2_2 || d2_2_3 || d2_2_4", "d2_3_1 || d2_3_2 || d2_3_3 || d2_3_4", "d2_3_1 || d2_3_2 || d2_4_1 || d2_4_2", "d2_3_3 || d2_3_4 || d2_4_3 || d2_4_4", "d2_4_1 || d2_4_2 || d2_4_3 || d2_4_4", "d3_1_1 || d3_1_2 || d3_1_3 || d3_1_4", "d3_1_1 || d3_1_2 || d3_2_1 || d3_2_2", "d3_1_1 || d3_2_1 || d3_3_1 || d3_4_1", "d3_1_2 || d3_2_2 || d3_3_2 || d3_4_2", "d3_1_3 || d3_1_4 || d3_2_3 || d3_2_4", "d3_1_3 || d3_2_3 || d3_3_3 || d3_4_3", "d3_1_4 || d3_2_4 || d3_3_4 || d3_4_4", "d3_2_1 || d3_2_2 || d3_2_3 || d3_2_4", "d3_3_1 || d3_3_2 || d3_3_3 || d3_3_4", "d3_3_1 || d3_3_2 || d3_4_1 || d3_4_2", "d3_3_3 || d3_3_4 || d3_4_3 || d3_4_4", "d3_4_1 || d3_4_2 || d3_4_3 || d3_4_4", "d4_1_1 || d4_1_2 || d4_1_3 || d4_1_4", "d4_1_1 || d4_1_2 || d4_2_1 || d4_2_2", "d4_1_1 || d4_2_1 || d4_3_1 || d4_4_1", "d4_1_2 || d4_2_2 || d4_3_2 || d4_4_2", "d4_1_3 || d4_1_4 || d4_2_3 || d4_2_4", "d4_1_3 || d4_2_3 || d4_3_3 || d4_4_3", "d4_1_4 || d4_2_4 || d4_3_4 || d4_4_4", "d4_2_1 || d4_2_2 || d4_2_3 || d4_2_4", "d4_3_1 || d4_3_2 || d4_3_3 || d4_3_4", "d4_3_1 || d4_3_2 || d4_4_1 || d4_4_2", "d4_3_3 || d4_3_4 || d4_4_3 || d4_4_4", "d4_4_1 || d4_4_2 || d4_4_3 || d4_4_4" ] assert '\n'.join(expected) == str(board0.cnf())
def solve2(boards): for n, board in enumerate(boards): print(n) game = SudokuBoard(board, n) strat = StrategyMk2(game) strat.solve()
def test_sat2(self): board = SudokuBoard([[1]]) assert board.solvable(full_resolution)
def test_solve2(self): board = SudokuBoard([[4, 1, 2, 3], [2, 3, 4, 1], [3, 4, 1, 2], [0, 0, 0, 0]]) solved = board.solve() expected = '\n'.join(['4123', '2341', '3412', '1234']) assert str(solved) == expected
def test_contents2(self): board = SudokuBoard([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]) assert set(board.contents()) == set()
def test_solve4(self): board = SudokuBoard([[2, 0, 0, 3], [0, 0, 0, 2], [0, 3, 1, 0], [4, 0, 0, 0]]) assert board.solve() == None
def test_sat1(self): board = SudokuBoard([[0, 0, 0, 3], [0, 0, 0, 2], [3, 0, 0, 0], [4, 0, 4, 4]]) assert not board.solvable(full_resolution)
#!/usr/bin/python import sys import math from sudoku import SudokuBoard class WritableObject: def __init__(self): self.content = "" def write(self, string): self.content = self.content + string boardObj = SudokuBoard('medium.txt') output = WritableObject() boardObj.printBoard() boardObj.runBFS() #boardObj.runDFS() #boardObj.runModifiedBFS() #boardObj.runModifiedDFS() while True : boardObj = SudokuBoard('medium.txt') boardObj.runSimulatedAnnealing(10000, .85) print out