def test_Puzzle_isValid(self): validPuzzle = sudoku.Puzzle( [sudoku.Square([4,3,5,6,8,2,1,9,7]), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertTrue(validPuzzle.isValid()) validPuzzleWithUnknowns = sudoku.Puzzle( [sudoku.Square([4,3,5,6,8,2,1,'?',7]), sudoku.Square([2,6,9,5,7,1,8,'?',4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertTrue(validPuzzleWithUnknowns.isValid()) validPuzzleAllUnkowns = sudoku.Puzzle( [sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?']), sudoku.Square(['?','?','?','?','?','?','?','?','?'])]) self.assertTrue(validPuzzleWithUnknowns.isValid()) invalidPuzzle = sudoku.Puzzle( [sudoku.Square([4,4,5,6,8,2,1,9,7]), # Two 4's in one square! sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertFalse(invalidPuzzle.isValid())
def solveSudokuPuzzle(puzzle): """Function returns solved puzzle.""" # Check if argument is a valid puzzle if not puzzle.isValid(): raise ValueError("Puzzle is no bueno!") # Find positions of unknowns. unknowns = [] for index, val in enumerate(puzzle.toList()): # Testing! if val == '?': unknowns.append(index) continue # Now brute force solve for those unknowns! """Some improvements to make later: - Dont try all possible ints, look at the Square the unknown is in and skip testing those values that are definitely not the case. """ # RANDOM APPROACH. solved = False while not solved: attempt_list = puzzle.toList() for u in unknowns: attempt_list[u] = random.randint(1,9) attempt = sudoku.Puzzle(attempt_list, isListOfInts=True) if attempt.isSolved(): return attempt print(unknowns) # Does it work? return "foo"
def __init__(self): super(Game, self).__init__() self.setup_mode = False self._puzzle = su.Puzzle() self._cells = [] for square in self._puzzle.squares: cell = Cell(self, square) self._cells.append(cell)
def test_Puzzle_setup_random_grid_80(): p = su.Puzzle() p.setup_random_grid(80) # assert p.is_solved assert len(p.assigned_grid) == 81 assert len(p.current_grid) == 81 assert len(p.solved_grid) == 81 all_solutions = list(su.solve(p.assigned_grid)) assert len(all_solutions) == 1 assert all_solutions[0] == p.solved_grid
def testSolver(self): solution = sudoku.Puzzle( [sudoku.Square([4,3,5,6,8,2,1,9,7]), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) hasTwoUnknownsPuzzle = sudoku.Puzzle( [sudoku.Square(['?',3,5,6,8,2,1,9,'?']), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) hasFiveUnknownsPuzzle = sudoku.Puzzle( [sudoku.Square(['?',3,5,6,8,2,1,9,'?']), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,'?',1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,'?',6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,'?',5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertEqual(solver.solveSudokuPuzzle(hasTwoUnknownsPuzzle).toList(), solution.toList()) self.assertEqual(solver.solveSudokuPuzzle(hasFiveUnknownsPuzzle).toList(), solution.toList())
def test_Puzzle_isSolved(self): solvedPuzzle = sudoku.Puzzle( [sudoku.Square([4,3,5,6,8,2,1,9,7]), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertTrue(solvedPuzzle.isSolved()) badSolutionPuzzle = sudoku.Puzzle( [sudoku.Square([7,3,5,6,8,2,1,9,4]), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertFalse(badSolutionPuzzle.isSolved()) hasUnknownsPuzzle = sudoku.Puzzle( [sudoku.Square(['?',3,5,6,8,2,1,9,'?']), sudoku.Square([2,6,9,5,7,1,8,3,4]), sudoku.Square([7,8,1,4,9,3,5,6,2]), sudoku.Square([8,2,6,3,7,4,9,5,1]), sudoku.Square([1,9,5,6,8,2,7,4,3]), sudoku.Square([3,4,7,9,1,5,6,2,8]), sudoku.Square([5,1,9,2,4,8,7,6,3]), sudoku.Square([3,2,6,9,5,7,4,1,8]), sudoku.Square([8,7,4,1,3,6,2,5,9])]) self.assertFalse(hasUnknownsPuzzle.isSolved())
def test_solve(self): p = s.Puzzle() v: int = 0 for x in range(0, 9): for y in range(0, 9): if (x % 3 == 0 and y == 0): v = int(x / 3) self.assertTrue(p.set_position(x, y, v % 9 + 1)) if (not (x == 8 and y == 8)): self.assertFalse(p.is_solved()) v = v + 1 v = v + 3 print() print(p) self.assertTrue(p.is_solved())
def test_print(self): puzzle = sudoku.Puzzle([1, 0, 2] * 27) correct_output = '''------------------------- | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | ------------------------- | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | ------------------------- | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | | 1 2 | 1 2 | 1 2 | ------------------------- ''' self.assertEqual(str(puzzle), correct_output)
for pb, symmetric_break in problems: exp = Experiment(pb, solver=solver) exp.launch(None, timeout=300, symmetry_break=symmetric_break) if False: exp = Experiment('sudoku', solver=constraint.NMCSSolver(level=1)) #exp = Experiment('nqueens', solver=constraint.BacktrackingSolver()) #exp = Experiment('nqueens', solver = constraint.NRPA(level=1, playouts=100, iterative=True, heuristics=True)) exp.launch(None, timeout=300, symmetry_break=False) if False: fixed = {8: 2, 9: 1, 16: 9, 17: 8, 18: 7, 15: 1, 19: 3, 20: 2, 22: 9, 25: 6, 28: 8, 29: 7, 34: 2, 50: 7, 43: 7, 38: 3, 37: 2, 42: 8, 46: 4, 47: 1, 58: 8, 65: 6, 73: 1, 66: 8, 69: 3, 76: 7, 81: 8} boxsize = 3 puzzle = sudoku.Puzzle(fixed, boxsize, format = 'd') print(puzzle) solved = sudoku.solve(puzzle, model = 'CP') print(solved) solved_2 = sudoku.solve(puzzle, model = 'CP', solver=constraint.BacktrackingSolver()) print(solved_2) solved_3 = sudoku.solve(puzzle, model = 'CP', solver=constraint.NMCSSolver(level=2)) print(solved_3) if False: filename = '3_4' #filename = '3_3' puzzle = parser.parse_sudoku(filename)
def test_row(self): puzzle = sudoku.Puzzle([1, 2, 3] * 27) self.assertEqual(puzzle.row(0), set(1, 2, 3))
def test_index_by_tuple(self): puzzle = sudoku.Puzzle([1, 0, 3, 4, 5, 6, 7, 8, 9] * 9) self.assertEqual(puzzle[1, 1], 0) puzzle[1, 1] = 2 self.assertEqual(puzzle[1, 1], 2)
def test_col(self): puzzle = sudoku.Puzzle([1, 2, 3] * 27) self.assertEqual(puzzle.col(0), set(1))
import sudoku import camera import vision import os import numpy as np #img_fn = os.getcwd() + "\\test_puzzle.jpg" img_fn = "test_puzzle.png" if __name__ == '__main__': print "--- Starting Sudoku Solver ---\n\n\n" puzzle_list = vision.find_puzzle(img_fn) print "Puzzle found\n" print np.reshape(puzzle_list, (9, 9)) puzzle = sudoku.Puzzle(puzzle_list) puzzle.solve() puzzle.print_unsolved() puzzle.print_solved() print "Puzzle solved\n" #vision.overlay(img_fn, rect, answer) print "--- Finished ---"
5, 9, 0, 0, 0, 0, 0, 0, 0 ] } def main(puzzle): # Try solving each method in turn, note sucesses solved = False while not solved: change = 0 # Basic counting rules algorithm (elimination) puzzle, tmpchg = sudoku.basic_rules(puzzle) change += tmpchg # Placing values in cells algorithm puzzle, tmpchg = sudoku.place_values(puzzle) change += tmpchg if change == 0: break if np.all(puzzle != 0): solved = True print(puzzle) print(sudoku.message(solved)) if __name__ == '__main__': puzzle = sudoku.Puzzle(puzzles['Basic']) main(puzzle)
def test_index_by_scalar(self): puzzle = sudoku.Puzzle([1, 2, 3, 4, 0, 6, 7, 8, 9] * 9) self.assertEqual(puzzle[4], 0) puzzle[4] = 5 self.assertEqual(puzzle[4], 5)
def test_iterator(self): puzzle = sudoku.Puzzle([1] * 81) self.assertEqual([i for i in puzzle], [1] * 81)
def test_cell(self): puzzle = sudoku.Puzzle([1, 2, 3, 4, 5, 6, 7, 8, 9] * 9) self.assertEqual(puzzle.cell(4, 4), set(4, 5, 6))
def test_options(self): puzzle = sudoku.Puzzle([0] * 81) puzzle[0, 3] = 1 puzzle[3, 0] = 2 puzzle[2, 2] = 3 self.assertEqual(puzzle.options(0, 0), {4, 5, 6, 7, 8, 9})