"""
Solution for -> Validate Sudoku with size `NxN`.
Created by Egor Kostan.
GitHub: https://github.com/ikostan
"""
from kyu_5.did_i_finish_my_sudoku.sudoku_by_row \
import assert_sudoku_by_row
from kyu_5.did_i_finish_my_sudoku.sudoku_by_column \
import assert_sudoku_by_column
from kyu_5.did_i_finish_my_sudoku.sudoku_by_regions \
import assert_sudoku_by_region
[docs]
class Sudoku:
"""
Sudoku class.
Given a Sudoku data structure with size `NxN, N > 0
and √N == integer`, write a method to validate if it
has been filled out correctly.
"""
def __init__(self, data: list):
"""
Create a new Sudoku instance.
:param data:
"""
self.__data: list = data
[docs]
def is_valid(self) -> bool:
"""
Sudoku validator.
A method to validate if given a Sudoku has been filled out correctly.
Sudoku -> data structure with size NxN, N > 0 and √N == integer.
:return: bool
"""
if not self.is_data_valid() \
or not assert_sudoku_by_row(self.__data) \
or not assert_sudoku_by_column(self.__data):
return False
if len(self.__data) > 1 and not assert_sudoku_by_region(self.__data):
return False
return True
[docs]
def is_data_valid(self) -> bool:
"""
Verify data validity.
:return: bool
"""
if not self.__data:
return False
if len(self.__data) == 1 \
and (self.__data[0][0] != 1 or isinstance(self.__data[0][0], bool)):
return False
return isinstance(self.__data, list)