Refactor Sudoku field and solver implementation
This commit is contained in:
+22
-22
@@ -20,7 +20,9 @@ Das erste stabile Release soll:
|
||||
Backtracking, DLX und sehr fortgeschrittene menschliche Strategien folgen auf
|
||||
dieses Kern-Release.
|
||||
|
||||
## Phase 0 – Lauffähige und getestete Basis (P0)
|
||||
## Phase 0 – Lauffähige und getestete Basis (P0) ✅
|
||||
|
||||
Abgeschlossen am 10. September 2026.
|
||||
|
||||
Zuerst wird der bestehende Zustand stabilisiert. In dieser Phase werden keine
|
||||
neuen Lösungsstrategien ergänzt.
|
||||
@@ -49,7 +51,9 @@ Abgeschlossen, wenn:
|
||||
- `go run .` das ausgewählte Beispiel ohne Panic beendet und
|
||||
- die bekannten Fehler jeweils einen Regressionstest besitzen.
|
||||
|
||||
## Phase 1 – Verlässliches Feldmodell (P0)
|
||||
## Phase 1 – Verlässliches Feldmodell (P0) ✅
|
||||
|
||||
Abgeschlossen am 10. September 2026.
|
||||
|
||||
- `field.Properties` beim Erzeugen prüfen: positive Dimensionen, passende
|
||||
Blockaufteilung und exakt passende Zellmatrix.
|
||||
@@ -65,14 +69,16 @@ Abgeschlossen, wenn:
|
||||
Fehler zurückgeben und das Feld unverändert lassen.
|
||||
- lesenden Zugriff auf Eigenschaften und Änderungshistorie anbieten, ohne
|
||||
interne Slices veränderbar nach außen zu geben.
|
||||
- allgemeine und 9x9-spezifische Darstellung trennen; `StringNotesForNumber`
|
||||
implementieren oder bis zu einem echten Bedarf aus der API entfernen.
|
||||
- die fest codierte 9x9-Darstellung durch eine allgemeine Darstellung ersetzen
|
||||
und `StringNotesForNumber` implementieren.
|
||||
|
||||
Abgeschlossen, wenn gültige, ungültige, unvollständige und gelöste Felder in
|
||||
Tabellentests eindeutig unterschieden werden und keine Mutation die
|
||||
Feld-Invarianten umgehen kann.
|
||||
|
||||
## Phase 2 – Robuste Parser- und Game-API (P0)
|
||||
## Phase 2 – Robuste Parser- und Game-API (P0) ✅
|
||||
|
||||
Abgeschlossen am 10. September 2026.
|
||||
|
||||
- Parserfehler vereinheitlichen und mit Zeilennummer sowie fehlerhaftem Feld
|
||||
anreichern.
|
||||
@@ -95,17 +101,12 @@ und Parser sowie `Game` keine implizite Rätselauswahl mehr enthalten.
|
||||
|
||||
- ein Solver-Interface definieren, das später menschlichen Solver, Backtracking
|
||||
und DLX austauschbar macht.
|
||||
- `Run(int) bool` durch eine aussagekräftige Schritt-API ersetzen, zum Beispiel
|
||||
- `Run(int) (bool, error)` durch eine aussagekräftige Schritt-API ersetzen, zum Beispiel
|
||||
mit den Zuständen `Progress`, `Solved`, `Stuck`, `Invalid` und `Failed`.
|
||||
- Konfiguration aus den ungenutzten `conf`-Feldern ableiten oder diese entfernen.
|
||||
- Strategie-Reihenfolge, Wiederholungspunkt und `ApplyNext`/`ApplyAll` eindeutig
|
||||
definieren.
|
||||
- gefundene Änderungen vor dem Anwenden deduplizieren und auf Konflikte prüfen.
|
||||
- Kandidaten nach jedem Zahlenschritt korrekt und deterministisch aktualisieren.
|
||||
- Tippfehler in öffentlichen Namen (`InitStragies`, `TriggerdBy`) kontrolliert
|
||||
migrieren und alle Aufrufer anpassen.
|
||||
- Abbruch bei Stillstand, ungültigem Zustand und internem Fehler sauber durch
|
||||
`sudoku.Game.Solve` reichen.
|
||||
|
||||
Abgeschlossen, wenn derselbe Input stets dieselben Schritte erzeugt und jeder
|
||||
Solverlauf genau einen überprüfbaren Endzustand besitzt.
|
||||
@@ -208,17 +209,16 @@ verwendet werden kann.
|
||||
|
||||
Diese Tickets bilden die kürzeste Route zu einem stabilen Zwischenstand:
|
||||
|
||||
1. Test-Helfer und Feldzugriffs-Tests erstellen.
|
||||
2. `ForEachCell`, `GetCell` und `Field.String` korrigieren.
|
||||
3. Change-Aktionen sowie Nil- und Werteprüfung absichern.
|
||||
4. `LastDigit` deduplizieren und den bekannten Panic per Regressionstest
|
||||
beseitigen.
|
||||
5. `HiddenSingle` korrigieren und vollständig testen.
|
||||
6. `Part.IsSolved`, `Field.IsValid` und `Field.IsSolved` implementieren.
|
||||
7. Puzzle-Bank-Parser atomar und indexsicher machen.
|
||||
8. Solver-Schrittergebnis und Konflikterkennung einführen.
|
||||
9. die vier Basisstrategien durch End-to-End-Rätseltests absichern.
|
||||
10. erst danach Paar-/Tripel-Strategien oder neue Bedienfunktionen beginnen.
|
||||
1. ein gemeinsames Solver-Interface und aussagekräftige Schrittzustände
|
||||
entwerfen.
|
||||
2. Strategie-Reihenfolge sowie `ApplyNext` und `ApplyAll` als öffentlichen
|
||||
Vertrag festlegen und testen.
|
||||
3. `InitStragies` und `TriggerdBy` kontrolliert auf korrekt geschriebene Namen
|
||||
migrieren.
|
||||
4. End-to-End-Tests für mehrere einfache und mittlere Puzzle-Bank-Rätsel
|
||||
ergänzen.
|
||||
5. anschließend `NakedPair`, `NakedTriple`, `HiddenPair` und `HiddenTriple`
|
||||
implementieren.
|
||||
|
||||
Nach jedem Arbeitspaket müssen `gofmt`, `go test ./...` und `go vet ./...`
|
||||
erfolgreich sein. Neue bekannte Baseline-Fehler sollen nicht angesammelt werden.
|
||||
|
||||
Reference in New Issue
Block a user