请求协助完成从Python转换的Ruby版Sudoku Validator
Ruby版数独验证器补全实现
先修正并补全你的代码,实现完整的数独验证逻辑:
class Sudoku def is_in_range(board) n = 9 n.times do |i| n.times do |j| val = board[i][j] return false if val <= 0 || val > 9 end end true end def valid_sudoku?(board) n = 9 # 检查所有数字是否在1-9范围内 return false unless is_in_range(board) # 检查每行是否有重复 board.each do |row| return false if row.uniq.length != n end # 检查每列是否有重复 n.times do |col| column = [] n.times do |row| column << board[row][col] end return false if column.uniq.length != n end # 检查每个3x3子格是否有重复 3.times do |box_row| 3.times do |box_col| box = [] 3.times do |i| 3.times do |j| box << board[box_row*3 + i][box_col*3 + j] end end return false if box.uniq.length != n end end # 所有检查通过 true end end 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 Sudoku.new.valid_sudoku?(board) puts "valid" else puts "Not valid" end end
关键修正与补充说明:
修复
is_in_range方法:- 原代码用
raise抛出异常不符合验证逻辑,改为直接返回布尔值 - 循环范围修正为
0-8(共9个元素),避免数组越界 - 使用Ruby更简洁的
times循环替代for循环
- 原代码用
补全
valid_sudoku?方法:- 添加行重复检查:通过
uniq方法判断去重后长度是否为9 - 添加列重复检查:提取每一列的元素后做同样的去重长度验证
- 添加3x3子格检查:遍历每个子格的起始坐标,提取3x3区域元素后验证重复
- 添加行重复检查:通过
主程序修正:
- 实例化
Sudoku对象后调用实例方法,原代码直接调用会报错 - 格式化数独数组,提升可读性
- 实例化
内容的提问来源于stack exchange,提问作者monish ravindra
相关产品推荐
相关产品推荐

