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)


4.91 µs ± 669 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [32]:
%timeit benchmark(1, False)


2.96 µs ± 147 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

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()


DEBUG:test:line: [5, 3, 4, 6, 7, 2, 1, 9, 8]
DEBUG:test:line: [6, 7, 8, 1, 9, 5, 3, 4, 2]
DEBUG:test:line: [9, 1, 2, 3, 4, 8, 5, 6, 7]
DEBUG:test:line: [8, 5, 9, 4, 2, 6, 7, 1, 3]
DEBUG:test:line: [7, 6, 1, 8, 5, 3, 9, 2, 4]
DEBUG:test:line: [4, 2, 3, 7, 9, 1, 8, 5, 6]
DEBUG:test:line: [9, 6, 1, 2, 8, 7, 3, 4, 5]
DEBUG:test:line: [5, 3, 7, 4, 1, 9, 2, 8, 6]
DEBUG:test:line: [2, 8, 4, 6, 3, 5, 1, 7, 9]
DEBUG:test:line: [5, 3, 4, 6, 7, 2, 1, 9, 8]
DEBUG:test:line: [6, 7, 8, 1, 9, 5, 3, 4, 2]
DEBUG:test:line: [9, 1, 2, 3, 4, 8, 5, 6, 7]
DEBUG:test:line: [8, 5, 9, 4, 2, 6, 7, 1, 3]
DEBUG:test:line: [7, 6, 1, 8, 5, 3, 9, 2, 4]
DEBUG:test:line: [4, 2, 3, 7, 9, 1, 8, 5, 6]
DEBUG:test:line: [9, 6, 1, 2, 8, 7, 3, 4, 5]
DEBUG:test:line: [5, 3, 7, 4, 1, 9, 2, 8, 6]
DEBUG:test:line: [3, 8, 4, 6, 3, 5, 1, 7, 9]

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]:
[7, 6, 1, 8, 5, 3, 9, 2, 4]

In [ ]: