Add functions to extract rows, colums and blocks
This commit is contained in:
		
							parent
							
								
									895a9dd01b
								
							
						
					
					
						commit
						61bbd00f6d
					
				
					 2 changed files with 64 additions and 12 deletions
				
			
		
							
								
								
									
										43
									
								
								src/board.cr
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								src/board.cr
									
										
									
									
									
								
							|  | @ -1,27 +1,50 @@ | |||
| 
 | ||||
| module Sudoku | ||||
| 
 | ||||
|   class BoardException < Exception | ||||
|   end | ||||
| 
 | ||||
|   class Board | ||||
| 
 | ||||
|     alias Value = Nil | Int8 | ||||
| 
 | ||||
|     enum State | ||||
|       Valid | ||||
|       Invalid | ||||
|     end | ||||
|     alias Value = Nil | Int32 | ||||
| 
 | ||||
|     @grid : Array(Array(Value)) | ||||
|     getter grid | ||||
| 
 | ||||
|     def initialize(@width : Int8, @height : Int8) | ||||
|       @grid = Array(Value).new(@width * @height, nil) | ||||
|     def initialize(@size : Int32, @block_size : Int32) | ||||
|       raise BoardException.new() unless @size.divisible_by?(@block_size) | ||||
|       @grid = Array(Array(Value)).new(@size) { Array(Value).new(@size, nil) } | ||||
|     end | ||||
| 
 | ||||
|     def put(value : Value, x, y) | ||||
|       @grid[y * @width + x] = value | ||||
|       @grid[y][x] = value | ||||
|     end | ||||
| 
 | ||||
|     def get(x, y) | ||||
|       @grid[y * @width + x] | ||||
|       @grid[y][x] | ||||
|     end | ||||
| 
 | ||||
|     def check_valid(value : Value, x, y) | ||||
| 
 | ||||
|     end | ||||
| 
 | ||||
|     def extract_row(y) | ||||
|       @grid[y] | ||||
|     end | ||||
| 
 | ||||
|     def extract_column(x) | ||||
|       (0..@size - 1).map { |i| get(x, i) } | ||||
|     end | ||||
| 
 | ||||
|     def extract_block(x, y) | ||||
|       block_start_x = x - (x % @block_size) | ||||
|       block_start_y = y - (y % @block_size) | ||||
| 
 | ||||
|       (block_start_y..block_start_y + @block_size - 1).map { |j| | ||||
|         (block_start_x..block_start_x + @block_size - 1).map { |i| | ||||
|           get(i, j) | ||||
|         } | ||||
|       } | ||||
|     end | ||||
|        | ||||
|   end | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue