I tried converting python file to ruby for sudoku validator. can someone help me to complete?
class Sudoku
def isinRange(board)
@N = 9
for i in (0..@N)
for j in (0..@N)
if ((board[i][j] <= 0) or (board[i][j] > 9))
raise False
end
end
raise True
end
end
def isValidSudoku(board)
@N = 9
if (isinRange(board) == False)
…………
if __FILE__ == $0
board = [ [ 7, 9, 2, 1, 5, 4, 3, 8, 6 ],
[ 6, 4, 3, 8, 2, 7, 1, 5, 9 ],
[ 8, 5, 1, 3, 9, 6, 7, 2, 4 ],
[ 2, 6, 5, 9, 7, 3, 8, 4, 1 ],
[ 4, 8, 9, 5, 6, 1, 2, 7, 3 ],
[ 3, 1, 7, 4, 8, 2, 9, 6, 5 ],
[ 1, 3, 6, 7, 4, 8, 5, 9, 2 ],
[ 9, 7, 4, 2, 1, 5, 6, 3, 8 ],
[ 5, 2, 8, 6, 3, 9, 4, 1, 7 ] ]
if (isValidSudoku(board))
puts "valid"
else
puts "Not valid"
end
end
end
3
I would do this:
require 'matrix'
class Sodoku
RANGE = (1..9).to_a
def initialize(board)
@board = board
end
def valid?
matrix.square? &&
subset_valid?(rows) && subset_valid?(columns) && subset_valid?(boxes)
end
private
attr_reader :board
def rows
board
end
def columns
board.transpose
end
def boxes
RANGE.map(&method(:submatrix))
end
def subset_valid?(lists)
lists.all? { |list| list.sort == RANGE }
end
def matrix
Matrix[*board]
end
def submatrix(number)
n = RANGE.max / 3
ranges = number.pred.divmod(n).map { |x| (x * n..x.succ * n - 1) }
matrix.minor(*ranges)
end
end
board = [ [ 7, 9, 2, 1, 5, 4, 3, 8, 6 ], [ 6, 4, 3, 8, 2, 7, 1, 5, 9 ], [ 8, 5, 1, 3, 9, 6, 7, 2, 4 ], [ 2, 6, 5, 9, 7, 3, 8, 4, 1 ], [ 4, 8, 9, 5, 6, 1, 2, 7, 3 ], [ 3, 1, 7, 4, 8, 2, 9, 6, 5 ], [ 1, 3, 6, 7, 4, 8, 5, 9, 2 ], [ 9, 7, 4, 2, 1, 5, 6, 3, 8 ], [ 5, 2, 8, 6, 3, 9, 4, 1, 7 ] ]
invalid = [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] ]
Sodoku.new(board).valid?
#=> true
Sodoku.new(invalid).valid?
#=> false
2