Skip to content

Instantly share code, notes, and snippets.

@chairco
Created December 21, 2018 06:06
Show Gist options
  • Save chairco/31218477e87ea3a69ab0c9504900ee06 to your computer and use it in GitHub Desktop.
Save chairco/31218477e87ea3a69ab0c9504900ee06 to your computer and use it in GitHub Desktop.
def solveSudoku(board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
while True:
board = check_row(board=board)
board = check_col(board=board)
board = check_group(board=board)
if check_set(board) == True:
break
return board
def check_row(board):
sudoku = {str(i) for i in range(1, 10)}
rows = []
for idx, row in enumerate(board):
rows.append([cell for cell in row if cell != '.' and not isinstance(cell, set)])
for idx, b in enumerate(board):
for idy, cell in enumerate(b):
if cell == '.':
board[idx][idy] = sudoku - set(rows[idx])
elif isinstance(cell, set):
data = cell - set(rows[idx])
board[idx][idy] = data if len(data) > 1 else ''.join(data)
return board
def check_col(board):
cols = []
board = [list(b) for b in zip(*board)]
for idx, col in enumerate(board):
cols.append([cell for cell in col if cell != '.' and not isinstance(cell, set)])
for idx, b in enumerate(board):
for idy, cell in enumerate(b):
if isinstance(cell, set):
data = cell - set(cols[idx])
board[idx][idy] = data if len(data) > 1 else ''.join(data)
return [list(b) for b in zip(*board)]
def check_group(board):
# check group
board = [list(b) for b in zip(*board)]
# group
matrix = [[] for _ in range(len(board))]
count, group = 0, 0
for i in range(0, 9):
c = 0
for j in range(0, 9, 3):
matrix[group + c].extend(board[i][j:j + 3])
c += 1
count += 1
if count % 3 == 0:
group = count
# check
row = [[] for _ in range(len(board))]
for idx, m in enumerate(matrix):
for cell in m:
if not isinstance(cell, set):
row[idx].append(cell)
for idx, m in enumerate(matrix):
for idy, cell in enumerate(m):
if isinstance(cell, set):
data = cell - set(row[idx])
matrix[idx][idy] = data if len(data) > 1 else ''.join(data)
# group
board = [[] for _ in range(len(board))]
count, group = 0, 0
for i in range(0, 9):
c = 0
for j in range(0, 9, 3):
board[group + c].extend(matrix[i][j:j + 3])
c += 1
count += 1
if count % 3 == 0:
group = count
return [list(b) for b in zip(*board)]
def check_set(board):
for b in board:
for cell in b:
if isinstance(cell, set):
return False
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment