From 8f7ac22afeb7f8b545ccb9e5b5f6f2d001438fea Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Sat, 26 Nov 2022 18:03:53 +0500 Subject: [PATCH] Problem 36: valid sudoku --- problems/36-valid-sudoku/main.rb | 63 ++++++++++++++++++++++++++++++++ problems/36-valid-sudoku/test.rb | 60 ++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 problems/36-valid-sudoku/main.rb create mode 100644 problems/36-valid-sudoku/test.rb diff --git a/problems/36-valid-sudoku/main.rb b/problems/36-valid-sudoku/main.rb new file mode 100644 index 0000000..f5f92c3 --- /dev/null +++ b/problems/36-valid-sudoku/main.rb @@ -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 diff --git a/problems/36-valid-sudoku/test.rb b/problems/36-valid-sudoku/test.rb new file mode 100644 index 0000000..a6f078a --- /dev/null +++ b/problems/36-valid-sudoku/test.rb @@ -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