In [98]:
import logging
logging.basicConfig()
log = logging.getLogger('test')
expected = [1,2,3,4,5,6,7,8,9]
def validate(arr, sortmethod=False):
if arr is None or len(arr) != 9:
return False
if sortmethod:
s = sorted(arr)
for i in range(9):
if i+1 != s[i]:
return False
return True
else:
s = sorted(arr)
return s == expected
In [27]:
tc = [1, 2, 3, 4, 5, 9, 7, 6, 8]
tc2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [28]:
def benchmark(n, sm=True):
for _ in range(n):
assert validate(tc, sortmethod=sm)
assert not validate(tc2, sortmethod=sm)
assert not validate(None, sortmethod=sm)
assert not validate([], sortmethod=sm)
In [29]:
%timeit benchmark(1, True)
In [32]:
%timeit benchmark(1, False)
In [88]:
### Part 3
# Given a 9 x 9 (2-dimensional array) board, ensure that it's a valid solved sudoku board. Optimize it
# Valid matrix
v1 = [ [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]]
inv1= [ [1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9]]
inv2 = [ [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, 9, 7]
]
inv3=[[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, 3, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 7, 9]]
In [109]:
def validateBoard(m, validateRowsAndColumns=True):
if validateRowsAndColumns:
if m is None or len(m) != 9:
return False
for inner in m:
if not validate(inner):
return False
for i in range(9):
col = [r[i] for r in m]
if not validate(col):
return False
for i in range(0,9,3):
for j in range(0,9,3):
box = [r[j:j+3] for r in m[i:i+3]]
line = [b for r in box for b in r]
log.debug('line: %s', line)
if not validate(line):
return False
return True
In [110]:
def check(testcase=None):
assert validateBoard(v1)
assert not validateBoard(inv1)
assert not validateBoard(inv2)
assert not validateBoard(inv3, False)
In [111]:
log.setLevel(logging.DEBUG)
check()
In [53]:
i = 3
# rows = v1[i:i+3]
# print(rows)
j = 3
box = [r[j:j+3] for r in v1[i:i+3]]
line = []
for r in box:
line.extend(r)
line
Out[53]:
In [ ]: