/
sudoku.py
60 lines (53 loc) · 1.71 KB
/
sudoku.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python
from __future__ import print_function
from board import Sudoku
from strategies import *
from argparse import ArgumentParser
import sys
def solve_board(board, guess, verbose):
"""Solve a single board."""
board = Sudoku(board)
exclude = None if guess else [999]
board.solve(exclude=exclude, verbose=verbose)
board.verify()
def solve_boards(file, guess, verbose):
"""Solve each board in a text file."""
if verbose:
print('#', 'solved?', 'board', 'strategy', sep='\t')
exclude = None if guess else [999]
with open(file, 'r') as boards:
for line in boards:
line = line.strip()
if not line or line.startswith('#'):
continue
board = Sudoku(line)
n = board.num_solved()
hardest = board.solve(exclude=exclude)
try:
board.verify()
except:
print('*** ERROR:', line)
Sudoku(line).solve(exclude=exclude, verbose=True)
break
if verbose:
print(board.num_solved() - n, 'TRUE' if board.solved() else 'FALSE',
line, hardest, sep='\t')
def main():
parser = ArgumentParser(description='Human-style Sudoku solver')
parser.add_argument('-g', '--guess', action='store_true',
help='allow guessing to solve')
parser.add_argument('-q', '--quiet', action='store_true',
help='solve a board without printing anything')
parser.add_argument('-f', '--file',
help='solve each board in a text file and output overall results as tab-separated data')
parser.add_argument('BOARD', nargs='?',
help='a single board to solve')
args = vars(parser.parse_args())
if args['BOARD']:
solve_board(args['BOARD'], args['guess'], not args['quiet'])
elif args['file']:
solve_boards(args['file'], args['guess'], not args['quiet'])
else:
parser.print_usage()
if __name__ == '__main__':
main()