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
|
@ -3,14 +3,43 @@ require "./spec_helper"
|
||||||
describe Sudoku::Board do
|
describe Sudoku::Board do
|
||||||
|
|
||||||
it "initialized grid with nil values" do
|
it "initialized grid with nil values" do
|
||||||
board = Sudoku::Board.new(8, 8)
|
board = Sudoku::Board.new(9, 3)
|
||||||
board.get(0, 0).should eq nil
|
board.get(0, 0).should eq nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "raises exception if board size is not divisible by block size" do
|
||||||
|
expect_raises(Sudoku::BoardException) do
|
||||||
|
Sudoku::Board.new(9, 4)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "puts numbers correctly" do
|
it "puts numbers correctly" do
|
||||||
board = Sudoku::Board.new(8, 8)
|
board = Sudoku::Board.new(9, 3)
|
||||||
board.put(1, 0, 0)
|
board.put(1, 0, 0)
|
||||||
board.get(0, 0).should eq 1
|
board.get(0, 0).should eq 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "extracts rows correctly" do
|
||||||
|
row = 1
|
||||||
|
board = Sudoku::Board.new(4, 2)
|
||||||
|
(0..3).each { |i| board.put(i, i, row) }
|
||||||
|
board.extract_row(row).should eq [0, 1, 2, 3]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "extracts columns correctly" do
|
||||||
|
column = 2
|
||||||
|
board = Sudoku::Board.new(4, 2)
|
||||||
|
(0..3).each { |i| board.put(i, column, i) }
|
||||||
|
board.extract_column(column).should eq [0, 1, 2, 3]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "extracts blocks correctly" do
|
||||||
|
board = Sudoku::Board.new(4, 2)
|
||||||
|
board.put(42, 2, 0)
|
||||||
|
board.put(43, 3, 0)
|
||||||
|
board.put(44, 2, 1)
|
||||||
|
board.put(45, 3, 1)
|
||||||
|
board.extract_block(3, 1).should eq [[42, 43], [44, 45]]
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
45
src/board.cr
45
src/board.cr
|
@ -1,27 +1,50 @@
|
||||||
|
|
||||||
module Sudoku
|
module Sudoku
|
||||||
|
|
||||||
class Board
|
class BoardException < Exception
|
||||||
|
|
||||||
alias Value = Nil | Int8
|
|
||||||
|
|
||||||
enum State
|
|
||||||
Valid
|
|
||||||
Invalid
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Board
|
||||||
|
|
||||||
|
alias Value = Nil | Int32
|
||||||
|
|
||||||
|
@grid : Array(Array(Value))
|
||||||
getter grid
|
getter grid
|
||||||
|
|
||||||
def initialize(@width : Int8, @height : Int8)
|
def initialize(@size : Int32, @block_size : Int32)
|
||||||
@grid = Array(Value).new(@width * @height, nil)
|
raise BoardException.new() unless @size.divisible_by?(@block_size)
|
||||||
|
@grid = Array(Array(Value)).new(@size) { Array(Value).new(@size, nil) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def put(value : Value, x, y)
|
def put(value : Value, x, y)
|
||||||
@grid[y * @width + x] = value
|
@grid[y][x] = value
|
||||||
end
|
end
|
||||||
|
|
||||||
def get(x, y)
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue