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 )