Refactor Sudoku field and solver implementation
This commit is contained in:
@@ -5,10 +5,10 @@ menschlichen Lösungsstrategien bearbeiten soll. Neben dem gelösten Feld soll
|
||||
langfristig auch der Lösungsweg mit Kandidaten, Änderungen und Markierungen
|
||||
verfügbar sein.
|
||||
|
||||
> [!WARNING]
|
||||
> Das Projekt befindet sich in einer frühen Entwicklungsphase. Der aktuelle
|
||||
> Prüflauf ist wegen eines Vet-Fehlers noch nicht grün und die Demo kann während des
|
||||
> Lösens abstürzen. Siehe [Bekannte Einschränkungen](#bekannte-einschränkungen).
|
||||
> [!NOTE]
|
||||
> Das Projekt befindet sich weiterhin in einer frühen Entwicklungsphase. Die
|
||||
> Basis ist getestet und die Demo läuft, der menschliche Solver unterstützt aber
|
||||
> bisher nur vier grundlegende Strategien.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
@@ -43,8 +43,9 @@ gofmt -w main.go field/*.go parser/*.go logic/*.go logic/strategies/*.go sudoku/
|
||||
go vet ./...
|
||||
```
|
||||
|
||||
Aktuell gibt es noch keine automatisierten Tests. Neue Funktionalität sollte
|
||||
nach Möglichkeit mit paketnahen `*_test.go`-Tests ergänzt werden.
|
||||
Die Pakete `field`, `parser`, `logic`, `logic/strategies` und `sudoku` besitzen
|
||||
Unit- und Regressionstests. Neue Funktionalität sollte weiterhin mit paketnahen,
|
||||
vorzugsweise tabellengesteuerten `*_test.go`-Tests ergänzt werden.
|
||||
|
||||
## Architektur
|
||||
|
||||
@@ -70,8 +71,9 @@ Puzzle-Bank-Datei -> parser.PuzzleBank -> field.Field
|
||||
|
||||
Eine Strategie implementiert `strategies.Strategy`. `SearchProgressableCells`
|
||||
sammelt mögliche Änderungen, `ApplyAll` oder `ApplyNext` übernimmt sie in das
|
||||
Feld. Wird eine Zahl gesetzt, entfernt der Solver den entsprechenden Kandidaten
|
||||
aus der zugehörigen Zeile, Spalte und dem Block.
|
||||
Feld. Wird eine Zahl gesetzt, entfernt das Feldmodell den entsprechenden
|
||||
Kandidaten automatisch und ohne Duplikate aus der zugehörigen Zeile, Spalte und
|
||||
dem Block.
|
||||
|
||||
Derzeit in `main.go` aktiv:
|
||||
|
||||
@@ -88,25 +90,27 @@ implementiert.
|
||||
`parser.PuzzleBank` erwartet das Format der
|
||||
[Sudoku Exchange Puzzle Bank](data/sudoku-exchange-puzzle-bank/README.md): pro
|
||||
Zeile einen 12-stelligen Hash, 81 Ziffern für das Rätsel und eine
|
||||
Schwierigkeitsbewertung. `0` steht für ein leeres Feld. Leere Zeilen werden
|
||||
übersprungen; alle eingelesenen Rätsel werden im Parser gespeichert.
|
||||
Schwierigkeitsbewertung. Hash, Zeichenzahl, Ziffern, Rating und Ausgangsbelegung
|
||||
werden geprüft. `0` steht für ein leeres Feld. LF und CRLF werden unterstützt,
|
||||
leere Zeilen werden übersprungen.
|
||||
|
||||
Für einzelne Rätsel steht außerdem `parser.PuzzleString` zur Verfügung. Er
|
||||
akzeptiert genau 81 Ziffern. Parser-Zugriffe liefern bei einem ungültigen Index
|
||||
einen Fehler; bei mehreren Puzzle-Bank-Einträgen wird der Index explizit an
|
||||
`sudoku.New` übergeben.
|
||||
|
||||
Die Datensätze unter `data/sudoku-exchange-puzzle-bank/` stehen unter der dort
|
||||
beiliegenden separaten Lizenz.
|
||||
|
||||
## Bekannte Einschränkungen
|
||||
|
||||
- `field.Field.IsValid` und die `IsSolved`-Prüfungen einzelner Bereiche sind
|
||||
noch nicht implementiert. Ein vollständig belegtes, aber ungültiges Feld kann
|
||||
daher als gelöst gelten.
|
||||
- `logic.Solver.GetSolutionPath` liefert noch keinen Lösungsweg.
|
||||
- Mehrere fortgeschrittene Strategien sind nur als leere Typen vorhanden.
|
||||
- `go test ./...` meldet aktuell in `field/field.go`, dass eine Ganzzahl direkt
|
||||
in einen String konvertiert wird.
|
||||
- Die Demo kann in `LastDigit.SearchProgressableCells` auf eine leere Zelle
|
||||
zugreifen und dadurch abstürzen.
|
||||
- Fehlertexte und Bezeichner sind derzeit teilweise deutsch, teilweise
|
||||
englisch; einige öffentliche Namen enthalten noch Tippfehler.
|
||||
- Der Solver besitzt noch kein gemeinsames Interface für menschliche,
|
||||
Backtracking- und DLX-Implementierungen.
|
||||
- Die Demo verwendet weiterhin einen fest kodierten Dateipfad und Puzzle-Index.
|
||||
- Der alte öffentliche Bezeichner `InitStragies` bleibt vorerst als
|
||||
Kompatibilitätsalias bestehen.
|
||||
|
||||
## Lizenz
|
||||
|
||||
|
||||
Reference in New Issue
Block a user