first commit

This commit is contained in:
William Bouzourène 2025-07-07 15:34:07 +02:00
commit 9ff067c791
Signed by: bouzoure
SSH key fingerprint: SHA256:19MbXpLua4rUtk8tunMesD8KUKb91LXLHg8E/qTooww
7 changed files with 336717 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
wordatro-solver
wordatro-solver.exe

14
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,14 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceRoot}",
"console": "integratedTerminal",
"args": ["exemple", "2"]
}
]
}

5
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
"editor.tabSize": 2,
"editor.detectIndentation": false,
"editor.insertSpaces": false,
}

5
go.mod Normal file
View file

@ -0,0 +1,5 @@
module git.readonly.ch/bouzoure/wordatro-solver
go 1.24.4
require golang.org/x/text v0.26.0

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=

159
main.go Normal file
View file

@ -0,0 +1,159 @@
package main
import (
"bufio"
"embed"
"fmt"
"log"
"os"
"slices"
"sort"
"strconv"
"strings"
"unicode"
"golang.org/x/text/runes"
"golang.org/x/text/transform"
"golang.org/x/text/unicode/norm"
)
//go:embed words/*.txt
var embeddedWords embed.FS
func getWords() ([]string, error) {
var words []string
counter := 0
file, err := embeddedWords.Open("words/francais.txt")
if err != nil {
return words, err
}
scnr := bufio.NewScanner(file)
for scnr.Scan() {
word := strings.TrimSpace(scnr.Text())
if filterWords(word) {
words = append(words, strings.ToLower(word))
}
counter++
}
file.Close()
return words, nil
}
func filterWords(word string) bool {
if len(word) <= 0 {
return false
}
if strings.Contains(word, " ") {
return false
}
if strings.Contains(word, "-") {
return false
}
if strings.Contains(word, "'") {
return false
}
return true
}
func removeAccents(word string) (string, error) {
transformer := transform.Chain(
norm.NFD,
runes.Remove(runes.In(unicode.Mn)),
norm.NFC,
)
word2, _, err := transform.String(
transformer,
word,
)
return word2, err
}
func main() {
fmt.Println("Wordatro solver by sata")
words, err := getWords()
if err != nil {
log.Fatal(err)
}
if len(os.Args) < 2 {
log.Fatal("Word not supplied as first argument")
}
inputLetters := strings.ToLower(os.Args[1])
inputJokers := 0
if len(os.Args) > 2 {
inputJokers, err = strconv.Atoi(os.Args[2])
if err != nil {
panic("Second argument is joker count and should be an interger")
}
}
inputLetters, err = removeAccents(inputLetters)
if err != nil {
panic(err)
}
var inputLetters2 []string
for _, letter := range inputLetters {
if unicode.IsLetter(letter) {
inputLetters2 = append(inputLetters2, string(letter))
}
}
sort.Strings(inputLetters2)
for k, word := range words {
words[k], err = removeAccents(word)
if err != nil {
panic(err)
}
}
sort.Slice(words, func(i, j int) bool {
return len(words[i]) < len(words[j])
})
for _, word := range words {
var letters []string
for _, letter := range word {
if unicode.IsLetter(letter) {
letters = append(letters, string(letter))
}
}
sort.Strings(letters)
if (len(inputLetters) + inputJokers) < len(letters) {
continue
}
var matches int
var used []int
for _, letter := range letters {
for k3, letter2 := range inputLetters2 {
if slices.Contains(used, k3) {
continue
}
if strings.EqualFold(letter, letter2) {
used = append(used, k3)
matches++
break
}
}
}
if (matches + inputJokers) == len(word) {
fmt.Printf("[%d] %s\n", len(word), word)
}
}
}

336530
words/francais.txt Normal file

File diff suppressed because it is too large Load diff