sudoku/puzzles.py

68 lines
2.1 KiB
Python
Raw Normal View History

#!env python3
# Eryn Wells <eryn@erynwells.me>
'''
Parser for puzzles in the ./puzzles directory.
'''
import argparse
import os.path
import sys
2017-10-12 12:29:49 -07:00
from sudoku import Sudoku, solvers
2017-10-11 16:05:10 -07:00
euler = []
norvig = []
2017-10-12 12:29:49 -07:00
def parse_puzzle_library(path, quiet=True):
if not quiet:
2017-10-12 12:29:49 -07:00
print('Parsing puzzles in {}'.format(path))
puzzles = _get_puzzles(path, quiet)
return puzzles
def _get_puzzles(filename, quiet):
with open(filename, 'r') as f:
puzzles = f.readlines()
return (_parse_puzzle(p, quiet) for p in puzzles if p)
def _parse_puzzle(puzzle, quiet):
puzzle = puzzle.strip()
if len(puzzle) == 81:
if not quiet:
print("Parsing '{}'".format(puzzle))
board = (int('0' if x == '.' else x) for x in puzzle)
return Sudoku(board=board)
else:
if not quiet:
print("Skipping '{}'".format(puzzle))
return None
def parse_args(args):
parser = argparse.ArgumentParser()
2017-10-12 12:29:49 -07:00
parser.add_argument('--solver', '-s', default=None,
help='The solver to use to solve this puzzle.')
parser.add_argument('--verbose', '-v', action='store_true', default=False,
help='Print extra information when parsing puzzle libraries.')
parser.add_argument('library',
help='A library file containing puzzles, one per line.')
parser.add_argument('indexes', metavar='N', nargs='+', type=int,
help='0-based indexes of puzzles in the library')
return parser.parse_args(args)
def main():
args = parse_args(sys.argv[1:])
2017-10-12 12:29:49 -07:00
puzzle_library = list(parse_puzzle_library(args.library, quiet=not args.verbose))
2017-10-11 15:51:55 -07:00
for i in args.indexes:
2017-10-12 12:29:49 -07:00
puzzle = puzzle_library[i]
print(puzzle)
if args.solver is not None:
2017-10-12 12:29:49 -07:00
try:
solver = getattr(solvers, args.solver)
puzzle.solve(solver.solve)
except AttributeError:
print('No solver named {}'.format(args.solver))
print(puzzle)
return 0
if __name__ == '__main__':
sys.exit(main())