Refactor Sudoku field and solver implementation

This commit is contained in:
2026-09-16 22:52:44 +02:00
parent 8a5ae8c640
commit f7f9c16184
24 changed files with 1574 additions and 603 deletions
+23 -19
View File
@@ -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