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
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
#-- 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
ValueError if any of the
characters are not either
a digit. See Section 5.6, “
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: