Ejemplo n.º 1
0
def steps(sudoku: Sudoku) -> Iterator[Step]:
    _sudoku = Sudoku(*sudoku.cells(), box_size=sudoku.box_size)

    all_techniques: Tuple[Type[Technique], ...] = (
        techniques.LoneSingle,
        techniques.HiddenSingle,
        techniques.NakedPair,
        techniques.NakedTriplet,
        techniques.LockedCandidate,
        techniques.XYWing,
        techniques.UniqueRectangle,
    )

    for step in techniques.BulkPencilMarking(_sudoku):
        _sudoku.update(step.changes)
        yield step

    while not _sudoku.is_solved():
        for technique in all_techniques:
            try:
                step = technique(_sudoku).first()
            except techniques.NotFound:
                continue
            else:
                _sudoku.update(step.changes)
                yield step
                break
        else:
            raise exceptions.Unsolvable
Ejemplo n.º 2
0
 def _get_correct_cells(self) -> List[Cell]:
     sudoku = Sudoku(*[c for c in self.sudoku.cells() if c.value],
                     box_size=self.sudoku.box_size)
     all_techniques = (
         BulkPencilMarking,
         techniques.NakedPair,
         techniques.NakedTriplet,
         techniques.LockedCandidate,
         techniques.XYWing,
         techniques.UniqueRectangle,
     )
     for technique in all_techniques:
         for result in technique(sudoku):
             sudoku.update(result.changes)
     return [cell for cell in sudoku.cells() if cell.candidates]
Ejemplo n.º 3
0
def eliminate(sudoku: Sudoku) -> Sudoku:
    _sudoku = Sudoku(*sudoku.cells(), box_size=sudoku.box_size)

    all_techniques = (
        techniques.LoneSingle,
        techniques.HiddenSingle,
    )

    for step in techniques.BulkPencilMarking(_sudoku):
        _sudoku.update(step.changes)

    has_result = True
    while has_result:
        for technique in all_techniques:
            has_result = False
            for step in technique(_sudoku):
                _sudoku.update(step.changes)
                has_result = True
    return _sudoku