# Checking a Sudoku grid for validity

A Sudoku square consists of a $9\times 9$ grid with entries such that each row, column and each of the 9 non-overlapping $3\times 3$ tiles contains the numbers 1—9 once only. The following program verifies that a provided grid is a valid Sudoku square.

import numpy as np

def check_sudoku(grid):
""" Return True if grid is a valid Sudoku square, otherwise False. """
for i in range(9):
# j, k index top left hand corner of each 3x3 tile
j, k = (i // 3) * 3, (i % 3) * 3
if len(set(grid[i,:])) != 9 or len(set(grid[:,i])) != 9\
or len(set(grid[j:j+3, k:k+3].ravel())) != 9:
return False
return True

sudoku = """145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764"""
# Turn the provided string, sudoku, into an integer array
grid = np.array([[int(i) for i in line] for line in sudoku.split()])
print(grid)

if check_sudoku(grid):
print('grid valid')
else:
print('grid invalid')


Here we use the fact that an array of length 9 contains 9 unique elements if the set formed from these elements has cardinality 9. No check is made that the elements themselves are actually the numbers 1—9.

The output for the example grid provided in the code is:

[[1 4 5 3 2 7 6 9 8]
[8 3 9 6 5 4 1 2 7]
[6 7 2 9 1 8 5 4 3]
[4 9 6 1 8 5 3 7 2]
[2 1 8 4 7 3 9 5 6]
[7 5 3 2 9 6 4 8 1]
[3 6 7 5 4 2 8 1 9]
[9 8 4 7 6 1 2 3 5]
[5 2 1 8 3 9 7 6 4]]
grid valid