wordle-clone/cmd/prep-words/main.go

115 lines
2.3 KiB
Go
Raw Normal View History

2025-01-24 22:45:55 +00:00
package main
import (
"bufio"
2025-01-25 00:30:04 +00:00
"bytes"
2025-01-24 22:45:55 +00:00
"encoding/json"
"flag"
"log"
2025-01-25 00:30:04 +00:00
"math/rand/v2"
2025-01-24 22:45:55 +00:00
"os"
2025-01-25 00:30:04 +00:00
"path/filepath"
2025-01-24 22:45:55 +00:00
"sort"
2025-01-25 00:30:04 +00:00
"time"
2025-01-24 22:45:55 +00:00
)
type wordList struct {
Words map[int][]string `json:"words"`
}
2025-01-25 00:30:04 +00:00
type shufflePattern struct {
Index map[int][]int `json:"index"`
}
2025-01-24 22:45:55 +00:00
func main() {
2025-01-25 00:30:04 +00:00
dictFile := flag.String("dict", "./dict/en_GB.dic", "dictionary of word to prep")
outDir := flag.String("out", "./site/assets/data", "output directory")
2025-01-24 22:45:55 +00:00
flag.Parse()
2025-01-25 00:30:04 +00:00
r := rand.New(rand.NewPCG(uint64(time.Now().UnixNano()), uint64(time.Now().UnixNano())))
2025-01-24 22:45:55 +00:00
words := wordList{
Words: make(map[int][]string),
}
if err := scanSuitableWords(*dictFile, func(word string) {
if len(word) >= 4 && len(word) <= 6 {
words.Words[len(word)] = append(words.Words[len(word)], word)
}
}); err != nil {
log.Fatal(err)
}
2025-01-25 00:30:04 +00:00
for k, word := range words.Words {
log.Printf("Found %d words of length %v", len(word), k)
2025-01-24 22:45:55 +00:00
sort.Strings(word)
}
2025-01-25 00:30:04 +00:00
var wordData bytes.Buffer
if err := json.NewEncoder(&wordData).Encode(words); err != nil {
log.Fatal(err)
}
if err := os.WriteFile(filepath.Join(*outDir, "words.json"), wordData.Bytes(), 0644); err != nil {
log.Fatal(err)
}
// Generate a shuffle pattern
shp := shufflePattern{Index: make(map[int][]int)}
for k := range words.Words {
pattern := make([]int, len(words.Words[k]))
for i := range words.Words[k] {
pattern[i] = i
}
for x := 4; x < r.IntN(8)+4; x++ {
r.Shuffle(len(pattern), func(i, j int) {
pattern[i], pattern[j] = pattern[j], pattern[i]
})
}
// TODO: shuffle
shp.Index[k] = pattern
}
var patternData bytes.Buffer
if err := json.NewEncoder(&patternData).Encode(shp); err != nil {
log.Fatal(err)
}
if err := os.WriteFile(filepath.Join(*outDir, "shuffle_pattern.json"), patternData.Bytes(), 0644); err != nil {
2025-01-24 22:45:55 +00:00
log.Fatal(err)
}
}
func scanSuitableWords(dictFile string, withWord func(word string)) error {
f, err := os.Open(dictFile)
if err != nil {
return err
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
isSuitable := true
breakpoint := len(scanner.Text())
for i, r := range scanner.Text() {
if r == '/' {
breakpoint = i
break
}
if r < 'a' || r > 'z' {
isSuitable = false
break
}
}
if isSuitable {
word := scanner.Text()[:breakpoint]
withWord(word)
} else {
}
}
return scanner.Err()
}