Finish propagation
parent
9d75e1d967
commit
4a20d444ea
|
@ -8,11 +8,14 @@ import random
|
||||||
import re
|
import re
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import Sudoku_Solver as solver
|
||||||
|
else:
|
||||||
from . import Sudoku_Solver as solver
|
from . import Sudoku_Solver as solver
|
||||||
#import Sudoku_Solver as solver
|
|
||||||
|
|
||||||
filledcell = re.compile('(?!0)')
|
filledcell = re.compile('(?!0)')
|
||||||
|
|
||||||
|
|
||||||
def check_for_nonzeros(seq):
|
def check_for_nonzeros(seq):
|
||||||
return len([m.start() for m in filledcell.finditer(seq)])
|
return len([m.start() for m in filledcell.finditer(seq)])
|
||||||
|
|
||||||
|
@ -44,7 +47,6 @@ def generate_dig_sequence(difficulty):
|
||||||
if difficulty <= 1:
|
if difficulty <= 1:
|
||||||
random_number = list(range(81))
|
random_number = list(range(81))
|
||||||
while len(random_number) > 0:
|
while len(random_number) > 0:
|
||||||
#print(len(random_number))
|
|
||||||
yield random_number.pop(random.randint(0, len(random_number)-1))
|
yield random_number.pop(random.randint(0, len(random_number)-1))
|
||||||
elif difficulty == 2:
|
elif difficulty == 2:
|
||||||
current = 0
|
current = 0
|
||||||
|
@ -94,7 +96,7 @@ def specify_grid_properties(difficulty):
|
||||||
|
|
||||||
def grid_to_array(grid):
|
def grid_to_array(grid):
|
||||||
assert len(grid) == 81
|
assert len(grid) == 81
|
||||||
sudoku_array = np.zeros((9,9))
|
sudoku_array = np.zeros((9,9), dtype=np.uint8)
|
||||||
for i in range(81):
|
for i in range(81):
|
||||||
r = int(i / 9)
|
r = int(i / 9)
|
||||||
c = i % 9
|
c = i % 9
|
||||||
|
@ -102,7 +104,60 @@ def grid_to_array(grid):
|
||||||
|
|
||||||
return sudoku_array
|
return sudoku_array
|
||||||
|
|
||||||
def generate_sudoku_puzzle(difficulty):
|
|
||||||
|
def array_to_grid(sudoku_array):
|
||||||
|
assert sudoku_array.shape == (9,9)
|
||||||
|
|
||||||
|
b = [str(num) for num in sudoku_array.reshape((81,))]
|
||||||
|
return ''.join(b)
|
||||||
|
|
||||||
|
|
||||||
|
def propagate_array(sudoku_array):
|
||||||
|
prop_seq = [random.randint(0, 2) for _ in range(random.randint(5, 15))]
|
||||||
|
|
||||||
|
#prop_seq = [0]
|
||||||
|
prev_num = -1
|
||||||
|
prev_bigcol = -1
|
||||||
|
prev_rot = -1
|
||||||
|
swap_choice = ((0, 1), (0, 2), (1, 2))
|
||||||
|
print(prop_seq)
|
||||||
|
for num in prop_seq:
|
||||||
|
if num == 0:
|
||||||
|
rot = random.randint(0, 2)
|
||||||
|
if num == prev_num and rot == 2-prev_rot:
|
||||||
|
rot += random.randint(1, 2)
|
||||||
|
rot %= 3
|
||||||
|
sudoku_array[:] = np.rot90(sudoku_array, k=rot+1)
|
||||||
|
prev_rot = rot
|
||||||
|
elif num == 1:
|
||||||
|
choice = random.randint(0, 2)
|
||||||
|
if num == prev_num:
|
||||||
|
choice += random.randint(1, 2)
|
||||||
|
choice %= 3
|
||||||
|
swap_bigcol = swap_choice[choice]
|
||||||
|
|
||||||
|
for i in range(3):
|
||||||
|
sudoku_array[:, [swap_bigcol[0]*3+i, swap_bigcol[1]*3+i]] \
|
||||||
|
= sudoku_array[:, [swap_bigcol[1] * 3 + i, swap_bigcol[0] * 3 + i]]
|
||||||
|
else:
|
||||||
|
choice = random.randint(0, 2)
|
||||||
|
bigcol_select = random.randint(0, 2)
|
||||||
|
if num == prev_num and bigcol_select == prev_bigcol:
|
||||||
|
choice += random.randint(1, 2)
|
||||||
|
choice %= 3
|
||||||
|
swap_col = swap_choice[choice]
|
||||||
|
|
||||||
|
sudoku_array[:, [bigcol_select * 3 + swap_col[0], bigcol_select * 3 + swap_col[1]]] \
|
||||||
|
= sudoku_array[:, [bigcol_select * 3 + swap_col[1], bigcol_select * 3 + swap_col[0]]]
|
||||||
|
|
||||||
|
prev_bigcol = bigcol_select
|
||||||
|
|
||||||
|
prev_num = num
|
||||||
|
|
||||||
|
print('Propagate Complete')
|
||||||
|
|
||||||
|
|
||||||
|
def generate_sudoku_grid(difficulty):
|
||||||
grid = generate_completed_grid(11)
|
grid = generate_completed_grid(11)
|
||||||
n_givens, lower_bound = specify_grid_properties(difficulty)
|
n_givens, lower_bound = specify_grid_properties(difficulty)
|
||||||
dig_sequence = generate_dig_sequence(difficulty)
|
dig_sequence = generate_dig_sequence(difficulty)
|
||||||
|
@ -114,7 +169,7 @@ def generate_sudoku_puzzle(difficulty):
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
print("Reach end of Sequence")
|
print("Reach end of Sequence")
|
||||||
break
|
break
|
||||||
row = i % 9
|
row = int(i / 9)
|
||||||
if check_for_nonzeros(grid[row:row+9]) > lower_bound:
|
if check_for_nonzeros(grid[row:row+9]) > lower_bound:
|
||||||
current_number = grid[i]
|
current_number = grid[i]
|
||||||
other_numbers = solver.digits.replace(current_number, '')
|
other_numbers = solver.digits.replace(current_number, '')
|
||||||
|
@ -127,13 +182,17 @@ def generate_sudoku_puzzle(difficulty):
|
||||||
if unique:
|
if unique:
|
||||||
grid = grid[:i] + '0' + grid[i+1:]
|
grid = grid[:i] + '0' + grid[i+1:]
|
||||||
holes += 1
|
holes += 1
|
||||||
# TODO: Propagate and Output
|
|
||||||
return grid
|
return grid
|
||||||
|
|
||||||
|
def generate_sudoku_puzzle(difficulty):
|
||||||
|
grid = generate_sudoku_grid(difficulty)
|
||||||
|
print('Givens: ', check_for_nonzeros(grid))
|
||||||
|
sudoku_array = grid_to_array(grid)
|
||||||
|
propagate_array(sudoku_array)
|
||||||
|
|
||||||
|
return sudoku_array
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
puzzle = generate_sudoku_puzzle(2)
|
a = generate_sudoku_puzzle(4)
|
||||||
print(check_for_nonzeros(puzzle))
|
print(a)
|
||||||
|
|
||||||
solver.display_grid(puzzle)
|
|
||||||
solver.display(solver.solve(solver.parse_grid(puzzle)))
|
|
||||||
|
|
|
@ -123,7 +123,7 @@ class SudokuSystem:
|
||||||
def generate_random_board(self):
|
def generate_random_board(self):
|
||||||
# TODO: Write function to generate a random board
|
# TODO: Write function to generate a random board
|
||||||
self.clear_grid()
|
self.clear_grid()
|
||||||
self.number_grid[:] = sdk_gen.grid_to_array(sdk_gen.generate_sudoku_puzzle(2))
|
self.number_grid[:] = sdk_gen.generate_sudoku_puzzle(2)
|
||||||
self.cell_status = self.number_grid > 0 * FIXED
|
self.cell_status = self.number_grid > 0 * FIXED
|
||||||
|
|
||||||
def check_valid_moves(self):
|
def check_valid_moves(self):
|
||||||
|
|
Loading…
Reference in New Issue