Changed Grid.is_filled() to a property.
Removed Grid.check(), which didn't do anything anyway.
Cleaned up Grid.solve() slightly and fixed an egregious logic error.
Clarified Cell.normalize() docstring.
size = property(attrgetter('_size'))
constraints = property(attrgetter('_constraints'))
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):
### Constructors
def __init__(self, box_height=3, box_width=None):
def cell(self, row, column):
return self._cells[self._cellidx(row, column)]
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
-
- 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
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()
for cell in self._cells:
cell_changes += cell.normalize()
Returns the number of cell changes."""
cell_changes = 0
Returns the number of cell changes."""
cell_changes = 0
for constraint in self.constraints:
cell_changes += constraint.resolve_uniques()
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."""
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
for method in self._solution_steps:
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 we changed something, start over with simple steps again
- # 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:
- """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.
This method is exhaustive; repeated calls should have no effect.
Returns the number of cell changes.
grid = Grid.from_string(puzzle)
grid.solve()
grid = Grid.from_string(puzzle)
grid.solve()
- self.assertTrue(grid.is_filled(), msg)
+ self.assertTrue(grid.filled, msg)
def test_simple(self):
self._test_single_puzzle("""
def test_simple(self):
self._test_single_puzzle("""