From 9ebabd4b56c637abf1d04ce5f3475fd80a07323d Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Wed, 11 Oct 2017 19:44:19 -0700 Subject: [PATCH] Add square setter to Sudoku --- sudoku/__init__.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/sudoku/__init__.py b/sudoku/__init__.py index 659739c..d9f4311 100644 --- a/sudoku/__init__.py +++ b/sudoku/__init__.py @@ -142,6 +142,22 @@ class Sudoku: def solve(self, solver): return solver.solve(self) + def set(self, x, y, value): + idx = self._xy_to_idx(x, y) + if idx in self._clues: + raise SquareIsClue('Cannot set clue square ({},{})'.format(x, y)) + + if value not in self.possible_values: + raise ValueError('{} not in set of possible values {}'.format(value, self.possible_values)) + + peers = self.peers(x, y) + if peers == self.possible_values: + raise NoPossibleValues('Peer set for ({},{}) contains all possible values'.format(x, y)) + if value in peers: + raise ValueExistsInPeers('{} already exists in the peer set for ({},{})'.format(value, x, y)) + + self._board[idx] = value + def _xy_to_idx(self, x, y): return y * self.row_size + x @@ -182,3 +198,15 @@ class Sudoku: fmt += '\n{spacer}' return fmt.format(board=[str(i) if i != 0 else ' ' for i in self._board], spacer=spacer, width=field_width) + +class SudokuError(Exception): + pass + +class SquareIsClue(SudokuError): + pass + +class NoPossibleValues(SudokuError): + pass + +class ValueExistsInPeers(SudokuError): + pass