はじめに
随分ご無沙汰です。
なかなか続きません。
難しいからですかね。
今回の敵も強そうだ。
Valid Sudoku
9x9マスのボードに数字が並べられている。
下記の3つのルールを満たしていた場合trueを返す - 全ての列に1~9の数字が入る - 全ての行に1~9の数字が入る - 3x3のマスに1~9の数字が入る
解法(むずくないか)
少し読み違えていた。
実際にsudokuを解くのかと思っていたら、inputとして与えられた時点での盤面の妥当性を判断するだけで良いみたい。
途中まで
# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
rows = Array.new(9) { Set.new }
cols = Array.new(9) { Set.new }
boxes = Array.new(9) { Set.new }
(0..9).each do |i|
(0..9).each do |j|
val = board[i][j]
next if val == "."
rows[i].include?(val) ? rows[i].add(val) : return false
cols[j].include?(val) ? cols[j].add(val) : return false
end
end
end
boxはどうやってやるんだろうか。
これは無理だ。
# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
rows = Array.new(9) { Set.new }
cols = Array.new(9) { Set.new }
boxes = Array.new(9) { Set.new }
(0...9).each do |i|
(0...9).each do |j|
val = board[i][j]
next if val == "."
rows[i].include?(val) ? (return false) : rows[i].add(val)
cols[j].include?(val) ? (return false) : cols[j].add(val)
box_index = ( i / 3) * 3 + ( j / 3 )
boxes[box_index].include?(val) ? (return false) : boxes[box_index].add(val)
end
end
true
end
今回得た教訓。
あとbox_indexのカラクリに気づけるか否か。
こっちの書き方の方がスマートかもしれない。
# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
rows = Array.new(9) {[]}
cols = Array.new(9) {[]}
boxes = Array.new(9) {[]}
(0...9).each do |row|
(0...9).each do |col|
c_num = board[row][col]
next if c_num == "."
bi = (row/3)*3 + (col/3)
if(rows[row].include?(c_num) || cols[col].include?(c_num) || boxes[bi].include?(c_num) )
return false
end
rows[row] << c_num
cols[col] << c_num
boxes[bi] << c_num
end
end
true
end
あとrubyはメソッドの最後の評価した値が戻り値になるのでreturnと書かなくても良いていう
この風潮。未だ慣れん。
終わりに
解けない問題が増えてきた。
んー悩みどころ。