15c7959d96
A Go library that returns every legal play ranked by score and scores or validates plays, using the Appel-Jacobson DAWG algorithm over github.com/iliadenisov/dafsa v1.1.0. - DAWG move generation (across / down / both), full tournament scoring with a per-tile breakdown; public Solver: GenerateMoves (ranked), ScorePlay, ValidatePlay. - Rulesets: English Scrabble, Russian Scrabble, Эрудит (parameterizable Ruleset). - cmd/builddict (build the DAWG from the dictionaries submodule), cmd/stress (self-play benchmark), selfplay engine; brute-force test oracle. - A GADDAG was implemented, benchmarked and removed (the DAWG was smaller and faster for a scoring solver); see RESULTS.md and ALGORITHM.md.
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package dictdawg_test
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/iliadenisov/alphabet"
|
|
|
|
"scrabble-solver/internal/dictdawg"
|
|
"scrabble-solver/internal/wordlist"
|
|
)
|
|
|
|
func TestBuildAndQuery(t *testing.T) {
|
|
words := wordlist.Encode([]string{"care", "cares", "cat"}, alphabet.Latin(), 2, 15)
|
|
f, err := dictdawg.Build(alphabet.Latin(), words)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if f.NumAdded() != 3 {
|
|
t.Fatalf("NumAdded = %d, want 3", f.NumAdded())
|
|
}
|
|
if i := f.IndexOfB([]byte{2, 0, 17, 4}); i != 0 { // care
|
|
t.Errorf("IndexOf(care) = %d, want 0", i)
|
|
}
|
|
if i := f.IndexOfB([]byte{2, 0, 19}); i != 2 { // cat
|
|
t.Errorf("IndexOf(cat) = %d, want 2", i)
|
|
}
|
|
if i := f.IndexOfB([]byte{2, 0, 17}); i != -1 { // car (absent)
|
|
t.Errorf("IndexOf(car) = %d, want -1", i)
|
|
}
|
|
|
|
path := filepath.Join(t.TempDir(), "d.dawg")
|
|
if err := dictdawg.Save(f, path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
g, err := dictdawg.Load(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer g.Close()
|
|
if i := g.IndexOfB([]byte{2, 0, 17, 4, 18}); i != 1 { // cares
|
|
t.Errorf("loaded IndexOf(cares) = %d, want 1", i)
|
|
}
|
|
}
|