SudokuService::puzzleIsValid()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
c 0
b 0
f 0
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
namespace CoenMooij\Sudoku;
4
5
use CoenMooij\Sudoku\Generator\HintGenerator;
6
use CoenMooij\Sudoku\Generator\PuzzleGenerator;
7
use CoenMooij\Sudoku\Generator\SolutionGenerator;
8
use CoenMooij\Sudoku\Puzzle\Difficulty;
9
use CoenMooij\Sudoku\Puzzle\Location;
10
use CoenMooij\Sudoku\Puzzle\Puzzle;
11
use CoenMooij\Sudoku\Solver\BacktrackSolver;
12
use CoenMooij\Sudoku\Solver\SimpleSolver;
13
use CoenMooij\Sudoku\Validator\GridValidator;
14
15
class SudokuService
16
{
17
    /**
18
     * @var SimpleSolver
19
     */
20
    private $simpleSolver;
21
    /**
22
     * @var SolutionGenerator
23
     */
24
    private $solutionGenerator;
25
    /**
26
     * @var PuzzleGenerator
27
     */
28
    private $puzzleGenerator;
29
    /**
30
     * @var BacktrackSolver
31
     */
32
    private $backtrackSolver;
33
    /**
34
     * @var HintGenerator
35
     */
36
    private $hintGenerator;
37
38
    public function __construct(
39
        HintGenerator $hintGenerator,
40
        SolutionGenerator $solutionGenerator,
41
        PuzzleGenerator $puzzleGenerator,
42
        BacktrackSolver $backtrackSolver,
43
        SimpleSolver $simpleSolver
44
    ) {
45
        $this->hintGenerator = $hintGenerator;
46
        $this->solutionGenerator = $solutionGenerator;
47
        $this->puzzleGenerator = $puzzleGenerator;
48
        $this->backtrackSolver = $backtrackSolver;
49
        $this->simpleSolver = $simpleSolver;
50
    }
51
52
    public function getHint(Puzzle $puzzle): Location
53
    {
54
        return $this->hintGenerator->generateOne($puzzle->getGrid());
55
    }
56
57
    /**
58
     * @return Location[]
59
     */
60
    public function getHints(Puzzle $puzzle): array
61
    {
62
        return $this->hintGenerator->generateAll($puzzle->getGrid());
63
    }
64
65
    public function simpleSolve(Puzzle $puzzle): Puzzle
66
    {
67
        $solvedGrid = $this->simpleSolver->solve($puzzle->getGrid());
68
        $puzzle->setGrid($solvedGrid);
69
70
        return $puzzle;
71
    }
72
73
    public function solve(Puzzle $puzzle): Puzzle
74
    {
75
        $grid = $this->simpleSolver->solve($puzzle->getGrid());
76
77
        if ($grid->numberOfEmptyValues() > 0) {
78
            $grid = $this->backtrackSolver->solve($grid);
79
        }
80
        $puzzle->setGrid($grid);
81
82
        return $puzzle;
83
    }
84
85
    public function generatePuzzle(Difficulty $difficulty): Puzzle
86
    {
87
        $solution = $this->solutionGenerator->generate();
88
89
        return $this->puzzleGenerator->generate($solution, $difficulty);
90
    }
91
92
    public function puzzleIsValid(Puzzle $puzzle): bool
93
    {
94
        return GridValidator::gridIsValid($puzzle->getGrid());
95
    }
96
}
97