Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.93 KB | None | 0 0
  1. import random
  2. import sys
  3. from time import time
  4.  
  5. def print_board(board):
  6.  
  7. row_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I']
  8. print(" ", end=' ')
  9. print(" 1 2 3 4 5 6 7 8 9")
  10. for x in range(0,9):
  11. word=''+row_labels[x]+'|'
  12.  
  13. for y in range(0,9):
  14. if(str(board[9*x+y]) == '0'):
  15. word+='-|'
  16. else:
  17. word += str(board[9*x+y]) + '|'
  18. print(" ",word)
  19.  
  20. def print_board2(board1, board2):
  21.  
  22. row_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I']
  23. print(" Input Board Solution Board ")
  24. print("------------------- ------------------")
  25. print(" 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9")
  26. for x in range(0,9):
  27. word = ''+row_labels[x]+'|'
  28. for y in range(0,9):
  29. if(str(board1[9*x+y]) == '0'):
  30. word+='-|'
  31. else:
  32. word += str(board1[9*x+y]) + '|'
  33. word += " "
  34. word += ''+row_labels[x]+'|'
  35. for z in range(0,9):
  36. word += str(board2[9*x+z]) + '|'
  37. print(word)
  38.  
  39.  
  40. def is_number(s):
  41. try:
  42. float(s)
  43. return True
  44. except ValueError:
  45. return False
  46.  
  47.  
  48. def board_check(board):
  49.  
  50. if(len(str(board)) == 0):
  51. return False
  52.  
  53. for e in board:
  54. if(not is_number(e)):
  55. print("\n --Board is not Integer (Has ",type(board),")--")
  56. return False
  57.  
  58. if(len(str(board)) < 81):
  59. print("\n --Board is length,",len(str(board)) ," (< 81)--")
  60. return False
  61.  
  62. return True
  63.  
  64. def board_select():
  65. f = open('puzzles.txt', 'r')
  66. total_puzzles = f.readlines()
  67. puzzle_number = random.randint(0,400)
  68. f.close()
  69.  
  70. return puzzle_number, total_puzzles[puzzle_number]
  71.  
  72.  
  73. ########
  74. #Solved#
  75. ########
  76.  
  77. #Is this board the solution?
  78. def solved(domains, neighborhood, variables):
  79. for e in variables:
  80. for neigh in neighborhood:
  81. answers = list(range(1,10))
  82. for elem in neigh:
  83. if(int(domains[elem][0]) in answers):
  84. answers.remove(int(domains[elem][0]))
  85. else:
  86. return False
  87.  
  88. return True
  89.  
  90. ##############
  91. #valid_choice#
  92. ##############
  93.  
  94. #Is this assignment valid?
  95. def valid_choice(elem, neighbors, assignment):
  96.  
  97. for neigh in neighbors[elem]:
  98. answers = list(range(1,10))
  99. if(int(assignment[elem][0]) != 0):
  100. answers.remove(int(assignment[elem][0]))
  101. for value in neigh:
  102. complete = False
  103. for p_val in assignment[value]:
  104. if(complete == False and int(p_val) !=0 and p_val in answers):
  105. answers.remove(int(p_val)); complete = True
  106.  
  107. if(complete == False and int(p_val) == 0):
  108. complete = True
  109.  
  110. if(complete == False):
  111. return False
  112.  
  113. return True
  114.  
  115. ##############
  116. #Faulty Board#
  117. ##############
  118.  
  119. def Faulty_Board(sudoku_input, neighborhood, variables):
  120. domains = dict()
  121.  
  122. for index, elem in enumerate(variables):
  123. domains[elem] = [int(sudoku_input[index])]
  124.  
  125. for e in variables:
  126. for neigh in neighborhood:
  127. answers = list(range(1,10))
  128. for elem in neigh:
  129. if(int(domains[elem][0]) == 0):
  130. pass
  131. elif(int(domains[elem][0]) in answers):
  132. answers.remove(int(domains[elem][0]))
  133. else:
  134. return str(elem[0])+str(int(elem[1])+1)
  135.  
  136. return False
  137.  
  138. def main():
  139. parser = argparse.ArgumentParser()
  140. parser.add_argument('board')
  141. args = parser.parse_args()
  142.  
  143. sudoku = Sudoku(args.board)
  144.  
  145. if(not board_check(sudoku_input)):
  146. board_num, sudoku_input = board_select()
  147.  
  148. print_board(sudoku_input)
  149.  
  150. #Set up Variables
  151. variables =[]
  152.  
  153. for letters in ['A','B','C','D','E','F','G','H','I']:
  154. for numbers in range(0,9):
  155. variables.append(str(letters) + str(numbers))
  156.  
  157. #Set up Neighbors in the form: neighbors[Cell] = [[Box], [Row], [Column]]
  158. neighbors = dict()
  159. neighborhood = [['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C0', 'C1', 'C2'],
  160. ['A3', 'A4', 'A5', 'B3', 'B4', 'B5', 'C3', 'C4', 'C5'],
  161. ['A6', 'A7', 'A8', 'B6', 'B7', 'B8', 'C6', 'C7', 'C8'],
  162. ['D0', 'D1', 'D2', 'E0', 'E1', 'E2', 'F0', 'F1', 'F2'],
  163. ['D3', 'D4', 'D5', 'E3', 'E4', 'E5', 'F3', 'F4', 'F5'],
  164. ['D6', 'D7', 'D8', 'E6', 'E7', 'E8', 'F6', 'F7', 'F8'],
  165. ['G0', 'G1', 'G2', 'H0', 'H1', 'H2', 'I0', 'I1', 'I2'],
  166. ['G3', 'G4', 'G5', 'H3', 'H4', 'H5', 'I3', 'I4', 'I5'],
  167. ['G6', 'G7', 'G8', 'H6', 'H7', 'H8', 'I6', 'I7', 'I8']]
  168.  
  169. #Add Rows to Neighborhood
  170. for letters in ['A','B','C','D','E','F','G','H','I']:
  171. row = []
  172. for numbers in range(0,9):
  173. row.append(str(letters)+str(numbers))
  174. neighborhood.append(row)
  175.  
  176. #Add Columns to Neighborhood
  177. for numbers in range(0,9):
  178. row = []
  179. for letters in ['A','B','C','D','E','F','G','H','I']:
  180. row.append(str(letters)+str(numbers))
  181. neighborhood.append(row)
  182.  
  183. for elem in variables: neighbors[elem] = []
  184.  
  185. for rows in neighborhood:
  186. for elem in rows:
  187. index = rows.index(elem)
  188. neighbors[elem].append(rows[:index] + rows[index + 1:]) #Add all elements in list form for box/row/column neighbors
  189.  
  190. #Set up Domains
  191. domains = dict()
  192. solved_elems = 0
  193.  
  194. for index, elem in enumerate(variables):
  195. if(int(sudoku_input[index]) == 0):
  196. domains[elem] = [1,2,3,4,5,6,7,8,9]
  197. solved_elems+=1
  198. else:
  199. domains[elem] = [int(sudoku_input[index])]
  200.  
  201. ##########################
  202. #Initialize Queue of Arcs#
  203. ##########################
  204. arc_q = []
  205.  
  206. for elem in variables:
  207. for neigh in neighbors[elem]:
  208. for elem2 in neigh:
  209. arc_q.append((elem,elem2))
  210.  
  211. ########################
  212. #Backtracking Algorithm#
  213. ########################
  214.  
  215. def backtracking(val, assignment, variables, neighbors, orig_domains):
  216. if(solved(assignment,neighborhood,variables)):
  217. return True
  218.  
  219. for x in orig_domains[val]:
  220. assignment[val] = [x]
  221. if(valid_choice(val, neighbors, assignment)):
  222. passed = 0
  223. next_val = 0
  224. for mm in variables:
  225. if(passed == 1 and len(orig_domains[mm])>1):
  226. next_val = mm
  227. break
  228. if(mm == val):
  229. passed = 1
  230.  
  231. if(next_val !=0):
  232. if(backtracking(next_val, assignment, variables, neighbors, orig_domains)):
  233. return True
  234. else:
  235. if(solved(assignment,neighborhood,variables)):
  236. return True
  237.  
  238.  
  239. assignment[val] = [0]
  240. return False
  241.  
  242. ###############
  243. #AC3 Algorithm#
  244. ###############
  245.  
  246. Solution = True
  247. ac3_elems = 0
  248.  
  249. while arc_q:
  250. elem1, elem2 = arc_q.pop(0)
  251.  
  252. #--------------#
  253. # Revised Func #
  254. #--------------#
  255. revised = False
  256. for elem1_sol in domains[elem1]:
  257. passed = False
  258. for elem2_sol in domains[elem2]:
  259. if(elem1_sol != elem2_sol):
  260. passed = True
  261.  
  262. if(passed == False):
  263. domains[elem1].remove(elem1_sol)
  264. revised = True
  265. ac3_elems+=1
  266.  
  267. if revised:
  268. if (len(domains[elem1]) == 0):
  269. Solution = False
  270. for neigh in neighbors[elem1]:
  271. for elem3 in neigh:
  272. if(elem3 != elem2):
  273. arc_q.append((elem3,elem1))
  274.  
  275. ################################################
  276. #Perform Backtracking on Reduced Solution Space#
  277. ################################################
  278.  
  279. selected = []
  280. answer_dict = dict()
  281.  
  282. next_val = 0
  283. assignment = dict()
  284.  
  285. for m in variables:
  286. if(len(domains[m]) == 1):
  287. assignment[m] = domains[m]
  288. else:
  289. assignment[m] = [0]
  290.  
  291. for m in variables:
  292. if(len(domains[m])>1): next_val = m; break
  293.  
  294.  
  295. if(next_val != 0):
  296. backtracking(next_val, assignment, variables, neighbors, domains)
  297. answer_dict = assignment
  298. else:
  299. answer_dict = domains
  300.  
  301.  
  302. ########
  303. #Output#
  304. ########
  305. answer=''
  306. solution_found = True
  307.  
  308. for index, elem in enumerate(variables):
  309. try:
  310. answer = answer + str(answer_dict[elem][0])
  311. except IndexError:
  312. solution_found = False
  313.  
  314. if(solution_found):
  315. print("Solution Board")
  316. print(" "+"--------------------")
  317. print_board(answer)
  318. else:
  319. print("\nError! This board is not Solvable!!")
  320.  
  321. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement