Skip to content

Instantly share code, notes, and snippets.

@Tsagadai
Created September 11, 2012 05:55
Show Gist options
  • Save Tsagadai/3696283 to your computer and use it in GitHub Desktop.
Save Tsagadai/3696283 to your computer and use it in GitHub Desktop.
My CS258 sudoku checker
# 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