func check(i, j) is cached { var (id, im) = i.divmod(9) var (jd, jm) = j.divmod(9) jd == id && return true jm == im && return true (id//3 == jd//3) && (jm//3 == im//3) } func solve(grid) { for i in ^grid { grid[i] && next var t = [grid[{|j| check(i, j) }.grep(^grid)]].freq { |k| t.has_key(k) && next grid[i] = k solve(grid) } << 1..9 grid[i] = 0 return nil } for i in ^grid { print "#{grid[i]} " print " " if (3 -> divides(i+1)) print "\n" if (9 -> divides(i+1)) print "\n" if (27 -> divides(i+1)) } } var grid = %i( 5 3 0 0 2 4 7 0 0 0 0 2 0 0 0 8 0 0 1 0 0 7 0 3 9 0 2 0 0 8 0 7 2 0 4 9 0 2 0 9 8 0 0 7 0 7 9 0 0 0 0 0 8 0 0 0 0 0 3 0 5 0 6 9 6 0 0 1 0 3 0 0 0 5 0 6 9 0 0 1 0 ) solve(grid)