Функционал проверки решений судоку реализован в объекте SudokuCheckerUtils
. Реализовано два сценария проверки regularChecker
и fastChecker
. regularChecker
реализует проверку всех свойств правильного решения судоку. fastChecker
реализует сценарий с меньшим числом проверок в соответствии с предлагаемой оптимизацией, сокращающей число проверок до 21 проверки последовательности длиной 9, а именно:4-х квадрантов 3 на 3, все столбцы и все строки кроме последней.
Для проверки того, что в последовательности из 9 элементов есть все цифры из диапазона [1..9]
реализован метод isNineDigitsMet
. Основной его принцип это аккумуляция найденных цифр в переменной типа Int в виде соответствующих (по позиции) бит с последующим сравнением полученного числа с числом 0x1FF
соответсвующим первым 9 единичным битам в двоичном представлении числа. Для обхода столбцов и квадрантов были реализованы ColumnIterator
и QuadrantIterator
. Так как regularChecker
и fastChecker
отличаются только наборами проверяемых последователльностей из 9 элементов, то сама проверка была реализована с помощью метода checkSudoku
, которому на вход помимо самой матрицы поступает case класс ItemsToCheck
, содержаший "индексы" проверяемых сущностей (строки,квадранты,столбцы).
Для проверки работоспособности реализованы модульные тесты с использованием библиотеки ScalaTest. Так как тестировать нужно 2 реализации, то был реализован трейт SudokuCheckBehavior
, описывающий тесты и два класса RegularCheckingSpec
и FastCheckingSpec
предоставляющих соответствующие реализации