Add helpers to get rows, cols, and squares for particular coordinates
This commit is contained in:
		
							parent
							
								
									3017b1e923
								
							
						
					
					
						commit
						93a4fecb26
					
				
					 1 changed files with 17 additions and 13 deletions
				
			
		
							
								
								
									
										30
									
								
								sudoku.py
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								sudoku.py
									
										
									
									
									
								
							|  | @ -41,7 +41,7 @@ class Sudoku: | |||
|         Return an iterable of ranges of indexes into the board, each defining a row. | ||||
|         ''' | ||||
|         sz = self.size | ||||
|         return (range(i * sz, i * sz + sz) for i in range(sz)) | ||||
|         return (self._row(i, size) for i in range(sz)) | ||||
| 
 | ||||
|     @property | ||||
|     def index_columns(self): | ||||
|  | @ -50,7 +50,7 @@ class Sudoku: | |||
|         ''' | ||||
|         sz = self.size | ||||
|         sz2 = sz ** 2 | ||||
|         return (range(i, sz2, sz) for i in range(sz)) | ||||
|         return (self._column(c, sz, sz2) for i in range(sz)) | ||||
| 
 | ||||
|     @property | ||||
|     def index_squares(self): | ||||
|  | @ -58,21 +58,16 @@ class Sudoku: | |||
|         Return an iterable of ranges of indexes into the board, each defining a square. | ||||
|         ''' | ||||
|         dim = self.dimension | ||||
|         return (self.square(x, y) for y in range(dim) for x in range(dim)) | ||||
|         return (self._square(x, y, dim) for y in range(dim) for x in range(dim)) | ||||
| 
 | ||||
|     # TODO: Break the above into helper methods that produce a single thing given an index. | ||||
|     def _row(self, r, size): | ||||
|         return range(r * size, r * size + size) | ||||
| 
 | ||||
|     @property | ||||
|     def solved(self): | ||||
|         expected = set(range(self.size)) | ||||
|         return all([ | ||||
|             all(expected == set(row) for row in self.rows), | ||||
|             all(expected == set(col) for col in self.columns), | ||||
|             all(expected == set(sqr) for sqr in self.squares) | ||||
|         ]) | ||||
|     def _column(self, c, size, size2): | ||||
|         return range(c, size2, size) | ||||
| 
 | ||||
|     def square(self, x, y): | ||||
|         dim = self.dimension | ||||
|     def _square(self, x, y, dim): | ||||
|         if (x < 0 or x >= dim) or (y < 0 or y >= dim): | ||||
|             raise IndexError('Invalid coordinates for square: ({}, {})'.format(x, y)) | ||||
| 
 | ||||
|  | @ -85,6 +80,15 @@ class Sudoku: | |||
|         ranges = itertools.chain(*[_range(i) for i in range(dim)]) | ||||
|         return ranges | ||||
| 
 | ||||
|     @property | ||||
|     def solved(self): | ||||
|         expected = set(range(self.size)) | ||||
|         return all([ | ||||
|             all(expected == set(row) for row in self.rows), | ||||
|             all(expected == set(col) for col in self.columns), | ||||
|             all(expected == set(sqr) for sqr in self.squares) | ||||
|         ]) | ||||
| 
 | ||||
|     def _apply_index_ranges(self, ranges): | ||||
|         return ((self._board[i] for i in r) for r in ranges) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue