예제 #1
0
def solve_puzzle():
    '''Solve Sudoku puzzle.
    '''
    text = request.form['text']
    pzl = SudokuPuzzle()
    pzl.set_puzzle(text)
    result = pzl.solve()
    return result, '200'
예제 #2
0
 def test_solved_duplicate_subsquare(self):
     puzzle = SudokuPuzzle(9, [['1', '2', '3', '7', '8', '9', '4', '5', '6'],
                               ['4', '5', '6', '1', '2', '3', '7', '8', '9'],
                               ['3', '1', '2', '9', '7', '8', '6', '4', '5'],
                               ['7', '8', '9', '4', '5', '6', '1', '2', '3'],
                               ['6', '4', '5', '3', '1', '2', '9', '7', '8'],
                               ['9', '7', '8', '6', '4', '5', '3', '1', '2'],
                               ['2', '3', '1', '8', '9', '7', '5', '6', '4'],
                               ['5', '6', '4', '2', '3', '1', '8', '9', '7'],
                               ['8', '9', '7', '5', '6', '4', '2', '3', '1']],
                           {"1", "2", "3", "4", "5", "6", "7", "8", "9"})
     self.assertFalse(puzzle.is_solved(), 'is_solved returning True when should be False')
예제 #3
0
 def test_solved_completed_puzzle(self):
     puzzle = SudokuPuzzle(9, [['1', '2', '3', '7', '8', '9', '4', '5', '6'],
                               ['4', '5', '6', '1', '2', '3', '7', '8', '9'],
                               ['7', '8', '9', '4', '5', '6', '1', '2', '3'],
                               ['3', '1', '2', '9', '7', '8', '6', '4', '5'],
                               ['6', '4', '5', '3', '1', '2', '9', '7', '8'],
                               ['9', '7', '8', '6', '4', '5', '3', '1', '2'],
                               ['2', '3', '1', '8', '9', '7', '5', '6', '4'],
                               ['5', '6', '4', '2', '3', '1', '8', '9', '7'],
                               ['8', '9', '7', '5', '6', '4', '2', '3', '1']],
                           {"1", "2", "3", "4", "5", "6", "7", "8", "9"})
     self.assertTrue(puzzle.is_solved(), 'is_solved returning False when should be True')
예제 #4
0
def test_performance(filename: str) -> None:
    """
    Gets the solver to solve puzzles from a text file, and prints the statistics.
    """
    symbol_set, times = {str(i) for i in range(1, 10)}, []
    with open(filename) as data:
        for line in data:
            line = line.strip('\n').replace('.', '*').replace('0', '*')
            symbols = [[c for c in line[i:i + 9]]
                       for i in range(0, len(line), 9)]
            puzzle = SudokuPuzzle(9, symbols, symbol_set)
            start = time()
            solution = depth_first_solve(puzzle)
            end = time()
            times.append(end - start)
            print(f'Input puzzle:\n{puzzle}')
            print(f'\nSolved in {end - start:.4f} seconds.\n')
            print(f'{solution}\n')
    result = f'Puzzles solved: {len(times)}\n' \
        f'Total time taken: {sum(times)}\n' \
        f'Average time per puzzle: {sum(times) / len(times)}\n' \
        f'Max time: {max(times)}\n'

    with open('progress.txt', 'a') as log:
        log.write(f'{str(datetime.now())[:-7]} (File: {filename})')
        log.write('\n' + result + '\n')
    print(result)
예제 #5
0
def test_performance(filename: str) -> None:
    """
    Gets the solver to solve puzzles from a text file, and prints the statistics.
    """
    symbol_set, times = {str(i) for i in range(1, 10)}, []
    speed_begin = measure_cpu_speed(5)
    with open(filename) as data:
        for line in data:
            line = line.strip('\n').replace('.', '*').replace('0', '*')
            symbols = [[c for c in line[i:i + 9]]
                       for i in range(0, len(line), 9)]
            puzzle = SudokuPuzzle(9, symbols, symbol_set)
            start = time()
            solution = depth_first_solve(puzzle)
            end = time()
            assert solution is not None, 'valid solution exists but not found'
            times.append(end - start)
            print(f'Input puzzle:\n{puzzle}')
            print(f'\nSolved in {end - start:.4f} seconds.\n')
            print(f'{solution}\n')
    speed_end = measure_cpu_speed(5)
    unstable = max(speed_begin, speed_end) / min(speed_begin, speed_end) > 1.10
    average_solve_time = sum(times) / len(times)
    average_cpu_speed = (speed_begin + speed_end) / 2
    result = f'Puzzles solved: {len(times)}\n' \
             f'Total time taken: {sum(times)}\n' \
             f'Average time per puzzle: {average_solve_time}\n' \
             f'Max time: {max(times)}\n' \
             f'Processor speeds: {speed_begin, speed_end} ({"unstable" if unstable else "stable"})\n' \
             f'Relative performance: {1_000_000 / (average_cpu_speed * average_solve_time)}\n'

    with open('progress.txt', 'a') as log:
        log.write(f'{str(datetime.now())[:-7]} (File: {filename})')
        log.write('\n' + result + '\n')
    print(result)
예제 #6
0
 def test_puzzle1(self):
     puzzle = SudokuPuzzle(9,
                           [["*", "*", "*", "7", "*", "8", "*", "1", "*"],
                            ["*", "*", "7", "*", "9", "*", "*", "*", "6"],
                            ["9", "*", "3", "1", "*", "*", "*", "*", "*"],
                            ["3", "5", "*", "8", "*", "*", "6", "*", "1"],
                            ["*", "*", "*", "*", "*", "*", "*", "*", "*"],
                            ["1", "*", "6", "*", "*", "9", "*", "4", "8"],
                            ["*", "*", "*", "*", "*", "1", "2", "*", "7"],
                            ["8", "*", "*", "*", "7", "*", "4", "*", "*"],
                            ["*", "6", "*", "3", "*", "2", "*", "*", "*"]],
                           {"1", "2", "3", "4", "5", "6", "7", "8", "9"})
     solved = depth_first_solve(puzzle)
     if not solved:
         self.fail("No solution found when there should be a solution.")
     solution = [['6', '4', '5', '7', '3', '8', '9', '1', '2'],
                 ['2', '1', '7', '5', '9', '4', '8', '3', '6'],
                 ['9', '8', '3', '1', '2', '6', '5', '7', '4'],
                 ['3', '5', '2', '8', '4', '7', '6', '9', '1'],
                 ['4', '9', '8', '6', '1', '3', '7', '2', '5'],
                 ['1', '7', '6', '2', '5', '9', '3', '4', '8'],
                 ['5', '3', '9', '4', '6', '1', '2', '8', '7'],
                 ['8', '2', '1', '9', '7', '5', '4', '6', '3'],
                 ['7', '6', '4', '3', '8', '2', '1', '5', '9']]
     self.assertEqual(solved.get_symbols(), solution, 'Solution is wrong.')
예제 #7
0
 def test_puzzle_empty(self):
     puzzle = SudokuPuzzle(9, [['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*'],
                               ['*', '*', '*', '*', '*', '*', '*', '*', '*']],
                           {"1", "2", "3", "4", "5", "6", "7", "8", "9"})
     solved = depth_first_solve(puzzle)
     if not solved:
         self.fail("No solution found when there should be a solution.")
     self.assertTrue(solved.is_solved(), 'Solve empty puzzle failed.')