Parse sudoku boards from strings
This commit is contained in:
parent
3136a94793
commit
d573aad4f2
3 changed files with 104 additions and 3 deletions
|
@ -10,9 +10,14 @@ module Sudoku
|
|||
|
||||
@grid : Array(Array(Value))
|
||||
getter grid
|
||||
|
||||
getter size
|
||||
getter block_size
|
||||
|
||||
def initialize(@size : Int32, @block_size : Int32)
|
||||
raise BoardException.new() unless @size.divisible_by?(@block_size)
|
||||
if !@size.divisible_by?(@block_size)
|
||||
raise BoardException.new("Invalid block size: #{@block_size} for board size: #{@size}")
|
||||
end
|
||||
@grid = Array(Array(Value)).new(@size) { Array(Value).new(@size, nil) }
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,41 @@
|
|||
module Sudoku
|
||||
# Parse a sudoku board from a string. Return a board.
|
||||
|
||||
class ParseException < Exception
|
||||
end
|
||||
|
||||
class Parser
|
||||
def self.parse(board_str)
|
||||
|
||||
# Parse a sudoku board from a string. Return a board.
|
||||
# The string must contain valid board rows. Each row must be separated by a newline.
|
||||
# Blanks are represented by dots.
|
||||
# E.g.:
|
||||
# .1.2
|
||||
# 2..4
|
||||
# .3..
|
||||
# ....
|
||||
def self.parse(board_str, block_size)
|
||||
rows = board_str.split('\n')
|
||||
board_size = rows.size
|
||||
board = Sudoku::Board.new(board_size, block_size)
|
||||
|
||||
rows.each_with_index { |row, y|
|
||||
if row.size != board_size
|
||||
raise ParseException.new("Invalid row size: #{row.size} for row: #{row}")
|
||||
end
|
||||
|
||||
row.each_char_with_index { |c, x|
|
||||
case c
|
||||
when '.'
|
||||
board.put(nil, x, y)
|
||||
when .number?
|
||||
board.put(c.to_s.to_i, x, y)
|
||||
else
|
||||
raise ParseException.new("Invalid character: #{c}")
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
board
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue