Created
September 11, 2012 05:55
-
-
Save Tsagadai/3696283 to your computer and use it in GitHub Desktop.
My CS258 sudoku checker
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# SPECIFICATION: | |
# | |
# check_sudoku() determines whether its argument is a valid Sudoku | |
# grid. It can handle grids that are completely filled in, and also | |
# grids that hold some empty cells where the player has not yet | |
# written numbers. | |
# | |
# First, your code must do some sanity checking to make sure that its | |
# argument: | |
# | |
# - is a 9x9 list of lists | |
# | |
# - contains, in each of its 81 elements, an integer in the range 0..9 | |
# | |
# If either of these properties does not hold, check_sudoku must | |
# return None. | |
# | |
# If the sanity checks pass, your code should return True if all of | |
# the following hold, and False otherwise: | |
# | |
# - each number in the range 1..9 occurs only once in each row | |
# | |
# - each number in the range 1..9 occurs only once in each column | |
# | |
# - each number the range 1..9 occurs only once in each of the nine | |
# 3x3 sub-grids, or "boxes", that make up the board | |
# | |
# This diagram (which depicts a valid Sudoku grid) illustrates how the | |
# grid is divided into sub-grids: | |
# | |
# 5 3 4 | 6 7 8 | 9 1 2 | |
# 6 7 2 | 1 9 5 | 3 4 8 | |
# 1 9 8 | 3 4 2 | 5 6 7 | |
# --------------------- | |
# 8 5 9 | 7 6 1 | 4 2 3 | |
# 4 2 6 | 8 5 3 | 7 9 1 | |
# 7 1 3 | 9 2 4 | 8 5 6 | |
# --------------------- | |
# 9 6 1 | 5 3 7 | 0 0 0 | |
# 2 8 7 | 4 1 9 | 0 0 0 | |
# 3 4 5 | 2 8 6 | 0 0 0 | |
# | |
# Please keep in mind that a valid grid (i.e., one for which your | |
# function returns True) may contain 0 multiple times in a row, | |
# column, or sub-grid. Here we are using 0 to represent an element of | |
# the Sudoku grid that the player has not yet filled in. | |
# check_sudoku should return None | |
ill_formed = [[5,3,4,6,7,8,9,1,2], | |
[6,7,2,1,9,5,3,4,8], | |
[1,9,8,3,4,2,5,6,7], | |
[8,5,9,7,6,1,4,2,3], | |
[4,2,6,8,5,3,7,9], # <--- | |
[7,1,3,9,2,4,8,5,6], | |
[9,6,1,5,3,7,2,8,4], | |
[2,8,7,4,1,9,6,3,5], | |
[3,4,5,2,8,6,1,7,9]] | |
# check_sudoku should return True | |
valid = [[5,3,4,6,7,8,9,1,2], | |
[6,7,2,1,9,5,3,4,8], | |
[1,9,8,3,4,2,5,6,7], | |
[8,5,9,7,6,1,4,2,3], | |
[4,2,6,8,5,3,7,9,1], | |
[7,1,3,9,2,4,8,5,6], | |
[9,6,1,5,3,7,2,8,4], | |
[2,8,7,4,1,9,6,3,5], | |
[3,4,5,2,8,6,1,7,9]] | |
# check_sudoku should return False | |
invalid = [[5,3,4,6,7,8,9,1,2], | |
[6,7,2,1,9,5,3,4,8], | |
[1,9,8,3,8,2,5,6,7], | |
[8,5,9,7,6,1,4,2,3], | |
[4,2,6,8,5,3,7,9,1], | |
[7,1,3,9,2,4,8,5,6], | |
[9,6,1,5,3,7,2,8,4], | |
[2,8,7,4,1,9,6,3,5], | |
[3,4,5,2,8,6,1,7,9]] | |
# check_sudoku should return True | |
easy = [[2,9,0,0,0,0,0,7,0], | |
[3,0,6,0,0,8,4,0,0], | |
[8,0,0,0,4,0,0,0,2], | |
[0,2,0,0,3,1,0,0,7], | |
[0,0,0,0,8,0,0,0,0], | |
[1,0,0,9,5,0,0,6,0], | |
[7,0,0,0,9,0,0,0,1], | |
[0,0,1,2,0,0,3,0,6], | |
[0,3,0,0,0,0,0,5,9]] | |
# check_sudoku should return True | |
hard = [[1,0,0,0,0,7,0,9,0], | |
[0,3,0,0,2,0,0,0,8], | |
[0,0,9,6,0,0,5,0,0], | |
[0,0,5,3,0,0,9,0,0], | |
[0,1,0,0,8,0,0,0,2], | |
[6,0,0,0,0,4,0,0,0], | |
[3,0,0,0,0,0,0,1,0], | |
[0,4,0,0,0,0,0,0,7], | |
[0,0,7,0,0,0,3,0,0]] | |
# returns True if everything is as it should be and False if it isn't | |
def valid_set(l): | |
b = [1,2,3,4,5,6,7,8,9] | |
for i in l: | |
if i in b: | |
b.pop(b.index(i)) | |
else: | |
if i != 0: return False | |
return True | |
def check_sudoku(grid): | |
# sanity checks | |
if len(grid) != 9: return None | |
for row in grid: | |
if len(row) != 9: return None | |
if type(row) is not list: return None | |
for e in row: | |
if (type(e) is not int or | |
e > 9 or | |
e < 0): return None | |
# parses the first row, column and square all at the same time. | |
for i in range(0, 9): | |
# rows | |
row = grid[i] | |
if valid_set(row)==False: return False | |
#columns | |
column = [(x[i]) for x in grid] | |
if valid_set(column)==False: return False | |
#squares | |
# takes i to be the row (rows i3+2) of the square and uses the sub array | |
# Then takes the sub-array of the columns | |
# ((i%3) *3) +3 | |
# number of the column * width of column + the width of the column minus 1 | |
# finally it uses sum to flatten it | |
square = sum([(x[(i%3)*3:(i%3)*3+3]) for x in grid[(i%3)*3:(i%3)*3+3]], []) | |
if valid_set(square)==False: return False | |
# nothing failed so it must be valid | |
return True | |
pass | |
subg = [[9,8,7,6,5,4,3,2,1], | |
[8,7,6,5,4,3,2,1,9], | |
[7,6,5,4,3,2,1,9,8], | |
[6,5,4,3,2,1,9,8,7], | |
[5,4,3,2,1,9,8,7,6], | |
[4,3,2,1,9,8,7,6,5], | |
[3,2,1,9,8,7,6,5,4], | |
[2,1,9,8,7,6,5,4,3], | |
[1,9,8,7,6,5,4,3,2]] | |
fpgd = [[2,9,0,0,0,0,0,7,0], | |
[3,0,6,0,0,8,4,0,0], | |
[8,0,0,0,4,0,0,0,2], | |
[0,2,0,0,3,1,0,0,7], | |
[0,0,0,0,8,0,0,0,0], | |
[1,0,0,9, 5.5, 0,0,6,0], | |
[7,0,0,0,9,0,0,0,1], | |
[0,0,1,2,0,0,3,0,6], | |
[0,3,0,0,0,0,0,5,9]] | |
fpgd2 = [[2,9,0,0,0,0,0,7,0], | |
[3,0,6,0,0,8,4,0,0], | |
[8,0,0,0,4,0,0,0,2], | |
[0,2,0,0,3,1,0,0,7], | |
[0,0,0,0,8,0,0,0,0], | |
[1,0,0,9, 5., 0,0,6,0], | |
[7,0,0,0,9,0,0,0,1], | |
[0,0,1,2,0,0,3,0,6], | |
[0,3,0,0,0,0,0,5,9]] | |
boolg = [[2,9,0,0, False, 0,0,7,0], | |
[3,0,6,0,0,8,4,0,0], | |
[8,0,0,0,4,0,0,0,2], | |
[0,2,0,0,3,1,0,0,7], | |
[0,0,0,0,8,0,0,0,0], | |
[1,0,0,9,5,0,0,6,0], | |
[7,0,0,0,9,0,0,0,1], | |
[0,0,1,2,0,0,3,0,6], | |
[0,3,0,0,0,0,0,5,9]] | |
tupl =[(2,9,0,0,0,0,0,7,0), | |
[3,0,6,0,0,8,4,0,0], | |
[8,0,0,0,4,0,0,0,2], | |
[0,2,0,0,3,1,0,0,7], | |
[0,0,0,0,8,0,0,0,0], | |
[1,0,0,9,5,0,0,6,0], | |
[7,0,0,0,9,0,0,0,1], | |
[0,0,1,2,0,0,3,0,6], | |
[0,3,0,0,0,0,0,5,9]] | |
print check_sudoku(ill_formed) # --> None | |
print check_sudoku(valid) # --> True | |
print check_sudoku(invalid) # --> False | |
print check_sudoku(easy) # --> True | |
print check_sudoku(hard) # --> True | |
# advanced tests from: http://forums.udacity.com/cs258/questions/2220/problem-set-3-code-thread?sort=votes&page=2 | |
print check_sudoku(subg) # incorrect subgrids | |
print check_sudoku(fpgd) # floats in the list | |
print check_sudoku(fpgd2) | |
print check_sudoku(boolg) # boolean in the list | |
print check_sudoku(tupl) # tuples instead of lists |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment