Algorithm-X-DLX
view release on metacpan or search on metacpan
examples/t/sudoku/03-sudokusolver.t view on Meta::CPAN
"BKW|AEI|DRP",
"ADP|WRB|EIK",
"ERI|PDK|BWA"
);
is_deeply( $solved, SudokuSolver::solve($puzzle), 'correct solution');
};
subtest 'custom regions' => sub {
plan tests => 2;
my $puzzle1 = Sudoku->new(join '',
"---------------\n",
"|. .|5 . . 6|4|\n",
"| --- | |\n",
"|2 . 1|. . .|7|\n",
"|-- |------ |\n",
"|.|. .|6 .|. .|\n",
"| ----- | |\n",
"|. .|. . 5|. .|\n",
"| | ----- |\n",
"|4 3|. .|. .|.|\n",
"| ------- --|\n",
"|.|. . 5|4 . .|\n",
"| | --- |\n",
"|.|4 . 7 .|2 .|\n",
"---------------\n"
);
my $puzzle2 = Sudoku->new(join '',
"---------------\n",
"|. 1|3 . . 2|.|\n",
"| --- | |\n",
"|6 2 .|. . 5|.|\n",
"|-- |------ |\n",
"|.|. .|7 .|6 .|\n",
"| ----- | |\n",
"|. .|. 4 .|. .|\n",
"| | ----- |\n",
"|1 .|. .|. .|.|\n",
"| ------- --|\n",
"|.|. . .|. . 6|\n",
"| | --- |\n",
"|2|. . . 6|. 7|\n",
"---------------\n"
);
my $solved2 = Sudoku->new(join '',
"---------------\n",
"|7 1|3 6 4 2|5|\n",
"| --- | |\n",
"|6 2 4|1 7 5|3|\n",
"|-- |------ |\n",
"|4|3 5|7 1|6 2|\n",
"| ----- | |\n",
"|5 6|2 4 3|7 1|\n",
"| | ----- |\n",
"|1 7|6 5|2 3|4|\n",
"| ------- --|\n",
"|3|4 7 2|5 1 6|\n",
"| | --- |\n",
"|2|5 1 3 6|4 7|\n",
"---------------\n"
);
throws_ok { SudokuSolver::solve($puzzle1) } qr/No solution/i, 'impossible regions';
is_deeply( $solved2, SudokuSolver::solve($puzzle2), 'correct solution');
};
subtest 'no solution' => sub {
plan tests => 1;
throws_ok { SudokuSolver::solve(Sudoku->new(join '',
"12|3.",
"..|..",
"-----",
"23|1.",
"..|.."
)) } qr/No solution/i, 'give up';
};
subtest 'multiple solutions' => sub {
plan tests => 2;
lives_ok { SudokuSolver::solve(Sudoku->new(join '',
"12|34",
".3|21",
"-----",
"..|12",
"21|43"
)) } 'passes';
throws_ok { SudokuSolver::solve(Sudoku->new(join '',
"12|34",
"..|21",
"-----",
"..|12",
"21|43"
)) } qr/Multiple solutions/i, 'give up';
};
done_testing();
( run in 0.647 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )