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