Tekninen Python-pohjainen Wordle-ratkaisija. Projekti suodattaa mahdollisia vastaussanoja Wordle-palautteen perusteella, poistaa jo aiemmin käytettyjä vastauksia ja pisteyttää jäljelle jäävät kandidaatit kirjainten sekä sijaintien informaatioarvon perusteella.
Ratkaisija ei pelaa Wordleä automaattisesti selaimessa. Se on komentoriviltä ajettava analyysityökalu, jonka syöte annetaan muokkaamalla src/main.py-tiedoston listoja.
- Vaatimukset
- Asennus ja ajo
- main.py:n käyttö
- Syöteformaatit
- Miten algoritmi toimii
- OSINT-tyylinen datan rikastaminen
- Pisteytys
- Projektin rakenne
- Vianhaku
- Python 3.9 tai uudempi
- Ei ulkoisia Python-kirjastoja
- Ajo repositorion juuresta, koska datatiedostojen polut ovat suhteellisia:
storage/public/wordlist.txtstorage/public/wordlist2.txtstorage/public/wordle_answers.csv
Kloonaa repositorio:
git clone https://github.com/Svinte/Wordle-Solver.git
cd Wordle-SolverAja ohjelma:
python src/main.pyJoissain ympäristöissä komento on:
python3 src/main.pyWindowsissa vaihtoehtoisesti:
py -3 src\main.pyOhjelma tulostaa:
- jäljellä olevien mahdollisten vastausten määrän
- ensimmäiset 30 kandidaattia
- kandidaattilistan yleisimmät kirjaimet
- viisi parhaiten pisteytettyä sanaa
Tulosteen rakenne:
Possible words: <määrä>
[<kandidaatteja>]
Letter frequencies:
<kirjain>: <määrä>
Top scored words:
<sana>: <pisteet>
Avaa src/main.py ja muokkaa kolmea listaa:
guesses = [
# esim. ("irate", "bybbg")
]
comparing = [
# esim. "bggby"
]
contains = [
# esim. "a|b|c**1"
]Tyypillinen käyttötapa:
- Pelaa Wordlessä ensimmäinen sana.
- Lisää arvaus ja Wordlen antama palaute
guesses-listaan. - Aja
python src/main.py. - Pelaa jokin
Top scored words-listan sanoista. - Lisää uusi palaute
guesses-listaan ja aja ohjelma uudelleen.
Esimerkki:
guesses = [
("irate", "bybbg"),
("scone", "bbgbb"),
]
contains = [
"r",
"e",
]
comparing = []Aja tämän jälkeen:
python src/main.pyguesses sisältää tavalliset Wordle-arvaukset ja niihin saadut palautekuviot.
guesses = [
("irate", "bybbg"),
]Palautemerkit:
| Merkki | Merkitys | Tekninen tulkinta |
|---|---|---|
g |
green | kirjain on oikeassa kohdassa |
y |
yellow | kirjain on sanassa, mutta väärässä kohdassa |
b |
black/gray | kirjain ei ole sanassa, tai kyseistä kirjainta ei ole enempää jäljellä |
Säännöt:
- arvauksen pitää olla 5 kirjainta
- palautteen pitää olla 5 merkkiä
- käytä pieniä kirjaimia
- palaute saa sisältää vain merkkejä
g,yjab
contains on manuaalinen lisäsuodatin tilanteisiin, joissa haluat kuvata kirjainjoukkoihin liittyvää tietoa.
| Sääntö | Merkitys |
|---|---|
"a" |
sanassa pitää olla kirjain a |
| `"a | b |
| `"a | b |
| `"a | b |
Huomio: * ja ** laskevat eri kirjainten osumia annetusta joukosta, eivät saman kirjaimen toistokertoja sanassa.
comparing on metatason suodatin. Se ei tarkoita yksittäistä arvausta samalla tavalla kuin guesses, vaan palautekuvion esiintyvyyttä suhteessa koko sallittujen arvausten listaan.
Esimerkki:
comparing = [
"bggby",
"yybbb*3",
]Tulkinta:
"bggby"tarkoittaa, että kandidaatin pitää olla sellainen, että vähintään yksi sanawordlist2.txt-listasta tuottaisi kandidaattia vasten palautteenbggby."yybbb*3"tarkoittaa, että vähintään kolmen sanan pitää tuottaa kandidaattia vasten palautekuvioyybbb.
Tätä voi käyttää silloin, kun halutaan hyödyntää palautekuvioiden rakennetta eikä vain yksittäisen arvauksen suoraa kirjaininformaatiota.
src/main.py tekee seuraavan putken:
wordlist.txt -> mahdolliset vastaukset
wordlist2.txt -> kaikki sallitut arvaukset
wordle_answers.csv -> aiemmat Wordle-vastaukset
a answers - past_answers
|
v
contains-suodatus
|
v
guesses-suodatus
|
v
comparison-suodatus
|
v
kirjainfrekvenssit + pisteytys
|
v
top-kandidaatit
Käytännössä:
src/main.pylukee kaikki sallitut arvaukset tiedostostastorage/public/wordlist2.txt.- Se lukee mahdolliset vastaukset tiedostosta
storage/public/wordlist.txt. - Se lukee aiemmat Wordle-vastaukset tiedostosta
storage/public/wordle_answers.csv. - Se poistaa aiemmat vastaukset kandidaattilistasta.
- Se ajaa
contains-säännöt. - Se ajaa tavalliset Wordle-palautesäännöt
guesses-listasta. - Se ajaa metatason
comparing-säännöt. - Se laskee jäljellä olevien kandidaattien kirjain- ja sijaintipohjaiset pisteet.
Tässä projektissa OSINT-tyylisyys tarkoittaa havaintojen rikastamista: yksittäistä raakapalautetta ei käsitellä vain värinä, vaan siitä muodostetaan rakenteellisia sääntöjä, joita voidaan yhdistää muihin avoimiin sanalistoihin ja historialliseen vastausdataan.
Raakadata:
("irate", "bybbg")Rikastettu data:
| Palautetyyppi | Raakahavainto | Rikastettu tulkinta |
|---|---|---|
vihreä g |
kirjain osui | oikea kirjain oikeassa indeksissä |
keltainen y |
kirjain on mukana | kirjain kuuluu sanaan, mutta ei tähän indeksiin |
harmaa b |
kirjain hylättiin | kirjain puuttuu tai ylimääräinen esiintymä puuttuu |
| sanalista | mahdollinen vastausjoukko | hypoteesiavaruus |
| aiemmat vastaukset | historiallinen data | kandidaatit, joita ei oletuksena enää käytetä |
| palautekuviot | bggby, yybbb jne. |
metatason signaaleja kandidaatin käyttäytymisestä eri arvauksia vasten |
Algoritmi toimii siksi samalla periaatteella kuin OSINT-analyysiputki:
havainto -> normalisointi -> sääntö -> hypoteesien poissulku -> rikastetut piirteet -> priorisoitu arvio
Wordlen antama palaute on havainto. Esimerkiksi:
("irate", "bybbg")Tämä ei vielä ole suoraan ratkaisu, vaan signaali.
Koodi muuntaa sanalistojen sanat pieniksi kirjaimiksi ja hyväksyy vain 5-merkkiset sanat. Tämä yhtenäistää lähdedatan ennen analyysiä.
_filter.py muuntaa palautteen loogisiksi ehdoiksi:
- vihreä lukitsee kirjaimen tiettyyn indeksiin
- keltainen vaatii kirjaimen esiintymisen mutta estää saman indeksin
- harmaa poistaa kirjaimen, jos sen sallittu määrä on jo käytetty vihreissä ja keltaisissa osumissa
Toistuvat kirjaimet käsitellään Counter-laskurilla. Ensin kulutetaan vihreät osumat, sitten keltaiset, ja lopuksi harmaat tarkistetaan jäljellä olevasta kirjainmäärästä. Tämä estää yleisen Wordle-virheen, jossa yksi harmaa kirjain tulkitaan väärin koko kirjaimen täydelliseksi puuttumiseksi, vaikka samaa kirjainta olisi jo osunut vihreänä tai keltaisena.
Jokainen sana wordlist.txt-tiedostossa on hypoteesi. Jos sana rikkoo yhdenkin säännön, se poistetaan.
Lopputulos ei ole enää pelkkä Wordle-väri, vaan pienempi joukko mahdollisia vastauksia.
comparing vie analyysin yhden tason ylemmäs. Sen sijaan, että tarkistettaisiin vain tietyn arvauksen palaute, koodi simuloi palautekuvioita kandidaattia vasten kaikilla sallituilla arvaussanoilla.
Tämä muuttaa kysymyksen muodosta:
Sopiiko tämä sana havaittuun palautteeseen?
muotoon:
Tuottaako tämä kandidaatti samanlaisen palautekuvioiden profiilin kuin havainto edellyttää?
Siksi comparing toimii enemmän metadatana kuin suorana kirjainsääntönä.
Kun kandidaatit on suodatettu, jäljellä olevia sanoja ei palauteta satunnaisessa järjestyksessä. Ne pisteytetään sen mukaan, miten hyvin ne kattavat jäljellä olevan kandidaattilistan yleisiä kirjaimia ja sijainteja.
Pisteytys tehdään src/_score.py-tiedostossa.
yellow_frequency laskee, kuinka monessa jäljellä olevassa kandidaatissa kukin kirjain esiintyy. Sama kirjain lasketaan vain kerran per sana.
Tämä suosii sanoja, joiden kirjaimet kattavat mahdollisimman paljon jäljellä olevaa hakutilaa.
green_frequency laskee, kuinka hyvin sanan kirjaimet esiintyvät samoissa kohdissa muiden kandidaattien kanssa.
Jos monessa jäljellä olevassa sanassa on sama kirjain samassa kohdassa, kyseinen sijainti kasvattaa pisteitä.
score_words laskee kokonaispisteen näin:
total_score = yellow_score * yellow_weight + green_score * green_weight
Oletuksena molemmat painot ovat 1.0.
Huomio: pisteytys suosittelee parhaita vastauskandidaatteja jäljellä olevasta vastausjoukosta. Se ei tee täyttä entropiapohjaista Wordle-strategiaa eikä valitse testiarvauksia kandidaattilistan ulkopuolelta.
Wordle-Solver/
├── README.md
├── LICENSE
├── src/
│ ├── main.py # komentoriviltä ajettava pääohjelma
│ ├── _filter.py # Wordle-palautteen ja comparison-sääntöjen suodatus
│ ├── _contains.py # contains-sääntöjen käsittely
│ ├── _common.py # kirjainfrekvenssit
│ └── _score.py # kandidaattilistan pisteytys
└── storage/
└── public/
├── wordlist.txt # mahdolliset Wordle-vastaukset
├── wordlist2.txt # kaikki sallitut arvaussanat
└── wordle_answers.csv # aiemmat Wordle-vastaukset
| Oire | Todennäköinen syy | Korjaus |
|---|---|---|
FileNotFoundError |
ohjelma ajettiin väärästä hakemistosta | aja komento repositorion juuresta: python src/main.py |
Invalid rule |
comparing-sääntö ei ole muodossa gybgy tai gybgy*2 |
tarkista, että sääntö on 5 merkkiä ja sisältää vain g, y, b |
No valid candidates found |
säännöt ovat ristiriidassa | poista viimeisin sääntö tai tarkista Wordle-palautteen merkit |
IndexError |
arvaus tai palaute ei ole 5 merkkiä | varmista, että jokainen guess ja result on täsmälleen 5 merkkiä |
| tulokset vaikuttavat vääriltä | käytössä on isoja kirjaimia syötteissä | käytä guesses, contains ja comparing -listoissa pieniä kirjaimia |
| vanha Wordle-arkistovastaus ei näy kandidaateissa | wordle_answers.csv poistaa aiemmin käytetyt vastaukset |
tyhjennä tai muokkaa historiallisen vastausdatan suodatusta, jos ratkaiset arkistopelejä |
MIT License.