This method parses the puzzle in its external form and converts it to a list of integers.
# - - - S u d o k u S o l v e r . _ _ r e a d P u z z l e - - -
def __readPuzzle ( self ):
"""Translate the puzzle from external to internal form.
[ self.givenPuzzle is a string ->
if self.givenPuzzle is a valid sudoku puzzle ->
return a list of BOARD_L integers representing
that puzzle
else -> raise ValueError ]
"""
Converting the puzzle from string form to a vector of
numbers is pretty straightforward. If we ignore all
whitespace in the input file, what is left should be a
string of exactly BOARD_L
characters, each of which should be "." or a digit in string form.
First we smash out all the whitespace and make self.givenPuzzle into a single string.
This can be done in one line as a list
comprehension:
#-- 1 --
# [ charList := a list whose elements are the
# non-whitespace characters of self.givenPuzzle in
# the same order ]
charList = [ c
for c in list(self.givenPuzzle)
if not c.isspace() ]
At this point we can test for the correct number of characters.
#-- 2 --
if len(charList) != BOARD_L:
raise ValueError, ( "Puzzle has %d nonblank "
"characters; it should have exactly %d." %
(len(charList), BOARD_L) )
All that remains is to check each character for validity
and convert them to their integer value. This step
raises ValueError if any of the
characters are not either "." or
a digit. See Section 5.6, “SudokuSolver.__readChar():
Translate one input character”.
#-- 3 --
# [ if each element of charList is either "." or in
# the interval ["1", "9"] ->
# result := a list of integers corresponding to the
# elements of charList consisting of integer 0
# where the value is "." and an integer in [1,9]
# where the value is a digit
# else ->
# raise ValueError ]
result = [ self.__readChar ( c )
for c in charList ]
#-- 4 --
return result
For trace table verification, see Section 7.2, “Trace table: SudokuSolver.__readPuzzle()”.