Advertisement
Catsher

Sudoku v1

May 5th, 2024
618
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.95 KB | None | 0 0
  1. from typing import Tuple
  2.  
  3.  
  4. def generate_matrixes(start_matrix: list[list[int]], nulls_passed: int = 0) -> list[list[list[int]]]:
  5.     if nulls_passed - 1 == count_nulls_in_matrix(start_matrix):
  6.         return [start_matrix]
  7.    
  8.     coords = count_coords(start_matrix, nulls_passed)
  9.     if coords is None:
  10.         print("\n\n\n\n\n\n\nNI NI NI\n\n\n\n\n\n\n")
  11.     x, y = coords
  12.  
  13.     numbers_we_can_put = get_possible_numbers(start_matrix, x, y)
  14.  
  15.     all_new_matrixes: list[list[list[int]]] = []
  16.     for numb in numbers_we_can_put:
  17.         new_matrix = my_deep_copy(start_matrix)
  18.         new_matrix[x][y] = numb
  19.         new_generated_matrixes = generate_matrixes(new_matrix, nulls_passed + 1)
  20.         all_new_matrixes = my_extend(all_new_matrixes, new_generated_matrixes)
  21.  
  22.     return all_new_matrixes
  23.    
  24.  
  25. def my_extend(arr1: list[list[list]], arr2: list[list[list]]) -> list[list[list]]:
  26.     for matrix in arr2:
  27.         arr1.append(matrix)
  28.     return arr1
  29.  
  30.  
  31. def my_deep_copy(arr: list[list]) -> list[list]:
  32.     new_arr = []
  33.     for i in range(len(arr)):
  34.         new_row = []
  35.         for j in range(len(arr[i])):
  36.             new_row.append(arr[i][j])
  37.         new_arr.append(new_row)
  38.     return new_arr
  39.  
  40. def count_coords(matrix: list[list[int]], at_null: int) -> Tuple[int, int]:
  41.     numbers_passed = 0
  42.  
  43.     for ind1 in range(len(matrix)):
  44.         for ind2 in range(len(matrix[ind1])):
  45.             elem = matrix[ind1][ind2]
  46.             if elem == 0 and numbers_passed != at_null:
  47.                 numbers_passed += 1
  48.             elif elem == 0 and numbers_passed == at_null:
  49.                 return ind1, ind2
  50.            
  51.  
  52. def get_possible_numbers(matrix: list[int], i: int, j: int) -> list[int]:
  53.     possible_numbers = get_canon_numbers()
  54.  
  55.     for ind_in_row in range(len(matrix[i])):
  56.         elem_in_row = matrix[i][ind_in_row]
  57.         if ind_in_row != j and elem_in_row != 0:
  58.             try_to_remove(possible_numbers, elem_in_row)
  59.  
  60.     for ind_in_col in range(len(matrix)):
  61.         elem_in_col = matrix[ind_in_col][j]
  62.         if ind_in_col != i and elem_in_col != 0:
  63.             try_to_remove(possible_numbers, elem_in_col)
  64.    
  65.     square = get_square(matrix, i, j)
  66.     for ind_1 in range(3):
  67.         for ind_2 in range(3):
  68.             elem = square[ind_1][ind_2]
  69.             if not(ind_1 == i and ind_2==j):
  70.                 if elem != 0:
  71.                     try_to_remove(possible_numbers, elem)
  72.  
  73.     return possible_numbers
  74.  
  75. def try_to_remove(arr: list[int], numb: int) -> list:
  76.     if numb in arr:
  77.         arr.remove(numb)
  78.    
  79.     return arr
  80.  
  81.  
  82. def get_square(matrix: list[int], i: int, j: int) -> list[int]:
  83.     square_i = i // 3
  84.     square_j = j // 3
  85.  
  86.     square = []
  87.     for ind_1 in range(3):
  88.         square_row = []
  89.  
  90.         for ind_2 in range(3):
  91.             elem = matrix[(square_i * 3) + ind_1][(square_j * 3) + ind_2]
  92.             square_row.append(elem)
  93.  
  94.         square.append(square_row)
  95.  
  96.     return square
  97.  
  98.  
  99. def count_nulls_in_matrix(matrix: list[list[int]]) -> int:
  100.     summ = 0
  101.     for i in range(len(matrix)):
  102.         for j in range(len(matrix[i])):
  103.             if matrix[i][j] == 0:
  104.                 summ += 1
  105.     return summ
  106.  
  107.  
  108. def check_if_matrix_right(matrix: list[list[int]]) -> bool:
  109.     canon_numbers = get_canon_numbers()
  110.  
  111.     for i in range(len(matrix)):
  112.         numbers_arr = []
  113.         for j in range(len(matrix[i])):
  114.             elem = matrix[i][j]
  115.             if elem == 0:
  116.                 return False
  117.             numbers_arr.append(elem)
  118.  
  119.         if not is_arrays_equal(numbers_arr, canon_numbers):
  120.             return False
  121.        
  122.     for col_ind in range(len(matrix)):
  123.         numbers_arr = []
  124.         for row_ind in range(len(matrix[col_ind])):
  125.             elem = matrix[row_ind][col_ind]
  126.             numbers_arr.append(elem)
  127.  
  128.         if not is_arrays_equal(numbers_arr, canon_numbers):
  129.             return False
  130.        
  131.     for square_i in range(3):
  132.         for square_j in range(3):
  133.             square = get_square(matrix, square_i * 3, square_j * 3)
  134.             numbers_arr = []
  135.             for i in range(3):
  136.                 for j in range(3):
  137.                     elem = square[i][j]
  138.                     numbers_arr.append(elem)
  139.             if not is_arrays_equal(numbers_arr, canon_numbers):
  140.                 return False
  141.            
  142.     return True
  143.        
  144.            
  145. def get_canon_numbers() -> list[int]:
  146.     return [i for i in range(1, 9 + 1)]
  147.  
  148.  
  149. def is_arrays_equal(arr1: list[int], arr2: list[int]) -> bool:
  150.     if len(arr1) != len(arr2):
  151.         return False
  152.    
  153.     for i in range(len(arr1)):
  154.         if arr1[i] != arr2[i]:
  155.             return False
  156.        
  157.     return True
  158.  
  159.  
  160. def sudoku(matrix):
  161.     all_variants = generate_matrixes(matrix, 0)
  162.     for variant in all_variants:
  163.         if check_if_matrix_right(variant):
  164.             return variant
  165.        
  166.     return matrix
  167.  
  168.  
  169. if __name__ == '__main__':
  170.     matrix =    [ [0, 0, 0, 8, 0, 0, 0, 0, 0],
  171.                       [4, 0, 0, 0, 1, 5, 0, 3, 0],
  172.                       [0, 2, 9, 0, 4, 0, 5, 1, 8],
  173.                       [0, 4, 0, 0, 0, 0, 1, 2, 0],
  174.                       [0, 0, 0, 6, 0, 2, 0, 0, 0],
  175.                       [0, 3, 2, 0, 0, 0, 0, 9, 0],
  176.                       [6, 9, 3, 0, 5, 0, 8, 7, 0],
  177.                       [0, 5, 0, 4, 8, 0, 0, 0, 1],
  178.                       [0, 0, 0, 0, 0, 3, 0, 0, 0] ]
  179.                      
  180.     matrix_copy =    [ [0, 0, 0, 8, 0, 0, 0, 0, 0],
  181.                       [4, 0, 0, 0, 1, 5, 0, 3, 0],
  182.                       [0, 2, 9, 0, 4, 0, 5, 1, 8],
  183.                       [0, 4, 0, 0, 0, 0, 1, 2, 0],
  184.                       [0, 0, 0, 6, 0, 2, 0, 0, 0],
  185.                       [0, 3, 2, 0, 0, 0, 0, 9, 0],
  186.                       [6, 9, 3, 0, 5, 0, 8, 7, 0],
  187.                       [0, 5, 0, 4, 8, 0, 0, 0, 1],
  188.                       [0, 0, 0, 0, 0, 3, 0, 0, 0] ]
  189.    
  190.     ans = sudoku(matrix)
  191.     is_right = check_if_matrix_right(ans)
  192.     print(is_right)
  193.     print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement