size = property(attrgetter('_size'))
constraints = property(attrgetter('_constraints'))
+ def _is_filled(self):
+ for cell in self._cells:
+ if cell.value == None:
+ return False
+ return True
+ filled = property(_is_filled)
+
### Constructors
def __init__(self, box_height=3, box_width=None):
def cell(self, row, column):
return self._cells[self._cellidx(row, column)]
- def is_filled(self):
- for cell in self._cells:
- if cell.value == None:
- return False
- return True
-
### Solving
- def check(self):
- """Returns True iff the grid is solved. Raises an exception if an
- integrity problem is found, such as a value appearing twice in a row.
- """
- # TODO remove this; name sucks and concept also sucks
- return None
-
-
def normalize_cells(self):
"""Normalizes every cell in the grid.
Returns the number of cell changes."""
cell_changes = 0
-
for cell in self._cells:
cell_changes += cell.normalize()
Returns the number of cell changes."""
cell_changes = 0
-
for constraint in self.constraints:
cell_changes += constraint.resolve_uniques()
def solve(self):
"""Attempts to solve the grid by running through various methods of
elimination one at a time, from simplest to most complex."""
- # XXX track how many cells are changed and repeat as appropriate
-
- while not self.is_filled():
- cell_changes = 0
+ while True:
for method in self._solution_steps:
- cell_changes += method(self)
+ cell_changes = method(self)
# If we changed something, start over with simple steps again
- if x != 0:
+ if cell_changes:
break
- # If we didn't do anything this round, we're stuck
- if cell_changes == 0:
+ # If we didn't do anything this round, we're done
+ if not cell_changes:
break
def normalize(self):
- """Checks to see if this cell has only one possible value left. If
- so, sets that as its value and eliminates it from every related cell.
+ """If this cell has been solved, eliminates its value as a candidate
+ from every other cell in every group it's in.
This method is exhaustive; repeated calls should have no effect.
Returns the number of cell changes.