Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. import sys
  2. from copy import deepcopy
  3.  
  4. def output(a):
  5. sys.stdout.write(str(a))
  6.  
  7. N = 9
  8.  
  9. field = [[5,1,7,6,0,0,0,3,4],
  10. [2,8,9,0,0,4,0,0,0],
  11. [3,4,6,2,0,5,0,9,0],
  12. [6,0,2,0,0,0,0,1,0],
  13. [0,3,8,0,0,6,0,4,7],
  14. [0,0,0,0,0,0,0,0,0],
  15. [0,9,0,0,0,0,0,7,8],
  16. [7,0,3,4,0,0,5,6,0],
  17. [0,0,0,0,0,0,0,0,0]]
  18.  
  19. def print_field(field):
  20. if not field:
  21. output("No solution")
  22. return
  23. for i in range(N):
  24. for j in range(N):
  25. cell = field[i][j]
  26. if cell == 0 or isinstance(cell, set):
  27. output('.')
  28. else:
  29. output(cell)
  30. if (j + 1) % 3 == 0 and j < 8:
  31. output(' |')
  32.  
  33. if j != 8:
  34. output(' ')
  35. output('\n')
  36. if (i + 1) % 3 == 0 and i < 8:
  37. output("- - - + - - - + - - -\n")
  38.  
  39. def read(field):
  40. """ Read field into state (replace 0 with set of possible values) """
  41.  
  42. state = deepcopy(field)
  43. for i in range(N):
  44. for j in range(N):
  45. cell = state[i][j]
  46. if cell == 0:
  47. state[i][j] = set(range(1,10))
  48.  
  49. return state
  50.  
  51. state = read(field)
  52.  
  53.  
  54. def done(state):
  55. """ Are we done? """
  56.  
  57. for row in state:
  58. for cell in row:
  59. if isinstance(cell, set):
  60. return False
  61. return True
  62.  
  63.  
  64. def propagate_step(state):
  65. """ Propagate one step """
  66.  
  67. new_units = False
  68.  
  69. for i in range(N):
  70. row = state[i]
  71. values = set([x for x in row if not isinstance(x, set)])
  72. for j in range(N):
  73. if isinstance(state[i][j], set):
  74. state[i][j] -= values
  75. if len(state[i][j]) == 1:
  76. state[i][j] = state[i][j].pop()
  77. new_units = True
  78. elif len(state[i][j]) == 0:
  79. return False, None
  80.  
  81. for j in range(N):
  82. column = [state[x][j] for x in range(N)]
  83. values = set([x for x in column if not isinstance(x, set)])
  84. for i in range(N):
  85. if isinstance(state[i][j], set):
  86. state[i][j] -= values
  87. if len(state[i][j]) == 1:
  88. state[i][j] = state[i][j].pop()
  89. new_units = True
  90. elif len(state[i][j]) == 0:
  91. return False, None
  92.  
  93. for x in range(3):
  94. for y in range(3):
  95. values = set()
  96. for i in range(3*x, 3*x+3):
  97. for j in range(3*y, 3*y+3):
  98. cell = state[i][j]
  99. if not isinstance(cell, set):
  100. values.add(cell)
  101. for i in range(3*x, 3*x+3):
  102. for j in range(3*y, 3*y+3):
  103. if isinstance(state[i][j], set):
  104. state[i][j] -= values
  105. if len(state[i][j]) == 1:
  106. state[i][j] = state[i][j].pop()
  107. new_units = True
  108. elif len(state[i][j]) == 0:
  109. return False, None
  110.  
  111. return True, new_units
  112.  
  113. def propagate(state):
  114. """ Propagate until we reach a fixpoint """
  115. while True:
  116. solvable, new_unit = propagate_step(state)
  117. if not solvable:
  118. return False
  119. if not new_unit:
  120. return True
  121.  
  122.  
  123. def solve(state):
  124. """ Solve sudoku """
  125.  
  126. solvable = propagate(state)
  127.  
  128. if not solvable:
  129. return None
  130.  
  131. if done(state):
  132. return state
  133.  
  134. for i in range(N):
  135. for j in range(N):
  136. cell = state[i][j]
  137. if isinstance(cell, set):
  138. for value in cell:
  139. new_state = deepcopy(state)
  140. new_state[i][j] = value
  141. solved = solve(new_state)
  142. if solved is not None:
  143. return solved
  144. return None
  145.  
  146. print_field(solve(state))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement