Problem 36: valid sudoku
This commit is contained in:
parent
459fb62da4
commit
8f7ac22afe
2 changed files with 123 additions and 0 deletions
63
problems/36-valid-sudoku/main.rb
Normal file
63
problems/36-valid-sudoku/main.rb
Normal file
|
@ -0,0 +1,63 @@
|
|||
# @param {Character[][]} board
|
||||
# @return {Boolean}
|
||||
def is_valid_sudoku(board)
|
||||
# Check rows
|
||||
return false unless sudoku_rows_valid?(board)
|
||||
|
||||
# Check columns
|
||||
return false unless sudoku_columns_valid?(board)
|
||||
|
||||
# Check sub-boxes
|
||||
return false unless sudoku_sub_boxes_valid?(board)
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def sudoku_rows_valid?(board)
|
||||
board.each do |row|
|
||||
digits = []
|
||||
row.each do |cell|
|
||||
return false if digits.include?(cell)
|
||||
|
||||
digits.push(cell) if cell != '.'
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def sudoku_columns_valid?(board)
|
||||
9.times do |i|
|
||||
digits = []
|
||||
board.each do |row|
|
||||
cell = row[i]
|
||||
return false if digits.include?(cell)
|
||||
|
||||
digits.push(cell) if cell != '.'
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def sudoku_sub_boxes_valid?(board)
|
||||
3.times do |i|
|
||||
# Select 3 rows
|
||||
rows = board[i * 3..i * 3 + 2]
|
||||
|
||||
3.times do |j|
|
||||
digits = []
|
||||
rows.each do |row|
|
||||
# Select 3 columns
|
||||
cols = row[j * 3..j * 3 + 2]
|
||||
cols.each do |cell|
|
||||
return false if digits.include?(cell)
|
||||
|
||||
digits.push(cell) if cell != '.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
end
|
60
problems/36-valid-sudoku/test.rb
Normal file
60
problems/36-valid-sudoku/test.rb
Normal file
|
@ -0,0 +1,60 @@
|
|||
require_relative 'main'
|
||||
require 'test/unit'
|
||||
|
||||
class TestSudokuValidator < Test::Unit::TestCase
|
||||
def test_valid_board
|
||||
assert_equal(true, is_valid_sudoku([
|
||||
['5', '3', '.', '.', '7', '.', '.', '.', '.'],
|
||||
['6', '.', '.', '1', '9', '5', '.', '.', '.'],
|
||||
['.', '9', '8', '.', '.', '.', '.', '6', '.'],
|
||||
['8', '.', '.', '.', '6', '.', '.', '.', '3'],
|
||||
['4', '.', '.', '8', '.', '3', '.', '.', '1'],
|
||||
['7', '.', '.', '.', '2', '.', '.', '.', '6'],
|
||||
['.', '6', '.', '.', '.', '.', '2', '8', '.'],
|
||||
['.', '.', '.', '4', '1', '9', '.', '.', '5'],
|
||||
['.', '.', '.', '.', '8', '.', '.', '7', '9']
|
||||
]))
|
||||
end
|
||||
|
||||
def test_invalid_row
|
||||
assert_equal(false, is_valid_sudoku([
|
||||
['5', '3', '.', '.', '7', '.', '.', '.', '.'],
|
||||
['6', '.', '.', '1', '9', '5', '.', '.', '.'],
|
||||
['.', '9', '8', '.', '.', '.', '.', '6', '.'],
|
||||
['8', '.', '.', '.', '6', '.', '.', '.', '3'],
|
||||
['4', '.', '.', '8', '.', '3', '.', '.', '1'],
|
||||
['7', '.', '2', '.', '2', '.', '.', '.', '6'],
|
||||
['.', '6', '.', '.', '.', '.', '2', '8', '.'],
|
||||
['.', '.', '.', '4', '1', '9', '.', '.', '5'],
|
||||
['.', '.', '.', '.', '8', '.', '.', '7', '9']
|
||||
]))
|
||||
end
|
||||
|
||||
def test_invalid_column
|
||||
assert_equal(false, is_valid_sudoku([
|
||||
['5', '3', '.', '.', '7', '.', '.', '.', '.'],
|
||||
['6', '.', '.', '1', '9', '5', '.', '.', '.'],
|
||||
['.', '9', '8', '.', '.', '.', '.', '6', '.'],
|
||||
['8', '.', '.', '.', '6', '.', '.', '.', '3'],
|
||||
['4', '.', '.', '8', '.', '3', '.', '.', '1'],
|
||||
['7', '.', '.', '.', '2', '.', '.', '.', '6'],
|
||||
['.', '6', '.', '.', '.', '.', '2', '8', '.'],
|
||||
['.', '.', '.', '4', '1', '9', '.', '.', '5'],
|
||||
['.', '.', '.', '.', '8', '3', '.', '7', '9']
|
||||
]))
|
||||
end
|
||||
|
||||
def test_invalid_sub_box
|
||||
assert_equal(false, is_valid_sudoku([
|
||||
['5', '3', '.', '.', '7', '.', '.', '.', '.'],
|
||||
['6', '.', '.', '1', '9', '5', '.', '.', '.'],
|
||||
['.', '9', '8', '.', '.', '.', '.', '6', '.'],
|
||||
['8', '.', '.', '.', '6', '.', '.', '.', '3'],
|
||||
['4', '.', '.', '8', '.', '3', '.', '.', '1'],
|
||||
['7', '.', '.', '.', '2', '.', '.', '.', '6'],
|
||||
['.', '6', '.', '.', '9', '.', '2', '8', '.'],
|
||||
['.', '.', '.', '4', '1', '9', '.', '.', '5'],
|
||||
['.', '.', '.', '.', '8', '.', '.', '7', '9']
|
||||
]))
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue