Beispiel #1
0
def test_equality():
    s = Sudoku.load_file(os.path.join(_test_dir, 'hard_sol.sud'))
    s2 = Sudoku.load_file(os.path.join(_test_dir, 'medium_sol.sud'))
    s3 = Sudoku.load_file(os.path.join(_test_dir, 'hard_sol.sud'))
    assert s != s2
    assert s == s3
    assert s != 5
Beispiel #2
0
def test_to_oneliner_method():
    s = Sudoku.load_file(os.path.join(_test_dir, 'hard.sud'))
    s.solve(verbose=True)
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'hard_sol.sud'))
    assert s == correct_solution
    oneliner = s.to_oneliner()
    oneliner_parsed = Sudoku(oneliner)
    assert oneliner_parsed == correct_solution
Beispiel #3
0
def solve(unsolved_sudoku):
    # https://github.com/hbldh/dlxsudoku
    from dlxsudoku import Sudoku
    from dlxsudoku.exceptions import SudokuHasMultipleSolutionsError, SudokuHasNoSolutionError, SudokuTooDifficultError

    s = table_to_string(unsolved_sudoku)
    try:
        sudoku = Sudoku(s)
        sudoku.solve()
    except SudokuHasNoSolutionError as e:
        print(e)
        return unsolved_sudoku
        pass
    except SudokuHasMultipleSolutionsError as e:
        print(e)
        return unsolved_sudoku
        pass
    except SudokuTooDifficultError as e:
        print(e)
        return unsolved_sudoku
    else:
        return string_to_table(sudoku.to_oneliner())
Beispiel #4
0
def test_README_code():
    sudoku_string_1 = "030467050920010006067300148301006027400850600090200400005624001203000504040030702"
    sudoku_string_2 = "# Example Sudoku\n" + \
                      "*72****6*\n" + \
                      "***72*9*4\n" + \
                      "*9*1****2\n" + \
                      "*******4*\n" + \
                      "82*4*71**\n" + \
                      "**9*6*8**\n" + \
                      "***9**6**\n" + \
                      "**3*72*9*\n" + \
                      "*6*843*7*"

    s1 = Sudoku(sudoku_string_1)
    s1.solve()
    assert s1.is_solved

    s2 = Sudoku(sudoku_string_2)
    s2.solve()
    assert s2.is_solved
Beispiel #5
0
from dlxsudoku import Sudoku

f = open('sudoku.txt', 'r')

ret = 0
for l in f:
    s = Sudoku(l)
    s.solve()
    s = s.to_oneliner()
    ret += int(s[0:3])
print ret
def AttemptSudokuSolve(InputQueue, ProcessedDigits, FinalImage):

    loaded_model = joblib.load('finalized_sudoku_model.sav')
    from dlxsudoku import Sudoku
    font = cv2.FONT_HERSHEY_SIMPLEX
    result_old = np.zeros(81)
    result_really_old = result_old
    result = np.zeros(81)
    while True:

        gray = InputQueue.get()
        img, cropped, digits = cw.extract_sudoku(gray)
        boardFound = 1
        result_really_really_old = result_really_old
        result_really_old = result_old
        result_old = result
        sleep(0.05)

        ProcessedDigits.put(img)

        result = loaded_model.predict(digits)
        resultList = (result_old, result_really_old, result_really_really_old)
        for resul in resultList:
            for i in result:
                if result[i] == 10:
                    if resul[i] != 10:
                        #print('correction2')
                        print(
                            str(result[i]) + " changed to " +
                            str(int(resul[i])))
                        result[i] = int(resul[i])
        temp = 0
        for i in result:
            if i == 10:
                temp = temp + 1
                result[i] = 0
        if temp >= 6:
            continue

        res = ""
        grid = np.zeros((9, 9), dtype='int')
        grid = result.reshape(9, 9)
        #Getting the set of numbers within a number's group------------------------------------

        for re in result:
            if re == 10:
                boardFound = 0
                break
            else:
                res += str(re)
        if boardFound == 1:
            #print(res)

            try:
                #start = time.time()
                s1 = Sudoku(res)
                s1.solve(verbose=False, allow_brute_force=True)
                #print("YAY!")
                stringlist = s1.to_oneliner()
                charlist = list(stringlist)
                results = list(map(int, charlist))
                #print(results)

                y = cropped.shape[0]
                cell_Spacing = y // 9
                posx = cell_Spacing // 2 - 4
                posy = cell_Spacing // 2 + 6

                for i in range(81):
                    if results[i] != result[i]:
                        cropped = cv2.putText(cropped, charlist[i],
                                              (posx, posy), font, 0.6,
                                              (0, 0, 255), 2, cv2.LINE_AA)
                    if posx + cell_Spacing >= y:
                        posy = posy + cell_Spacing
                        posx = cell_Spacing // 2 - 4
                    else:
                        posx = posx + cell_Spacing
                FinalImage.put(cropped)

            except:
                pass
                #print("too many solutions")
        else:
            pass
Beispiel #7
0
def test_solve_multiple_solutions():
    with pytest.raises(SudokuHasMultipleSolutionsError):
        s = Sudoku("***4*******9*******3**7*******7*********5*32*4**86***55*3****8*7983**4****6**9***")
        s.solve(verbose=True, allow_brute_force=True)
Beispiel #8
0
def test_solve_very_hard_sudoku_with_brute_force():
    s = Sudoku.load_file(os.path.join(_test_dir, 'very_hard.sud'))
    s.solve(verbose=True, allow_brute_force=True)
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'very_hard_sol.sud'))
    assert s == correct_solution
    assert 'BRUTE FORCE' in "".join(s.solution_steps)
Beispiel #9
0
def test_solve_very_hard_sudoku_raises_error_if_brute_force_disallowed():
    s = Sudoku.load_file(os.path.join(_test_dir, 'very_hard.sud'))
    with pytest.raises(SudokuTooDifficultError):
        s.solve(verbose=True, allow_brute_force=False)
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'very_hard_sol.sud'))
    assert s != correct_solution
Beispiel #10
0
def test_solve_hard_sudoku():
    s = Sudoku.load_file(os.path.join(_test_dir, 'hard.sud'))
    s.solve(verbose=True)
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'hard_sol.sud'))
    assert s == correct_solution
Beispiel #11
0
def test_solve_medium_sudoku():
    s = Sudoku.load_file(os.path.join(_test_dir, 'medium.sud'))
    s.solve()
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'medium_sol.sud'))
    assert s == correct_solution
Beispiel #12
0
def test_solve_simple_sudoku_read_from_flat_file():
    s = Sudoku.load_file(os.path.join(_test_dir, 'simple_flat.sud'))
    s.solve()
    correct_solution = Sudoku.load_file(os.path.join(_test_dir, 'simple_sol.sud'))
    assert s == correct_solution
Beispiel #13
0
def test_project_euler_sudokus(sudoku):
    sudoku[0] = b"# " + sudoku[0]
    s = Sudoku("".join([i.decode("utf-8") for i in sudoku]).strip())
    s.solve()
    assert s.is_solved
Beispiel #14
0
def test_str_repr():
    s = Sudoku.load_file(os.path.join(_test_dir, 'hard_sol.sud'))
    assert str(s) == repr(s)
Beispiel #15
0
def test_raises_error_when_input_is_invalid():
    with pytest.raises(SudokuHasNoSolutionError):
        s = Sudoku("***4*******9***5***3**7***2***7*********5*32*4**86***55*3****8*7983**4*2**6**9***")
        s.solve(verbose=True, allow_brute_force=True)
Beispiel #16
0
def test_raises_error_when_unsolvable_2():
    with pytest.raises(SudokuHasNoSolutionError):
        s = Sudoku.load_file(os.path.join(_test_dir, 'hard.sud'))
        s._matrix[2][7] = 6
        s.solve()