README and license
oCamlfmt
some file reorg
This plays "Squardle," a variation of Wordle. It's… way more chaotic, with multiple colors each with multiple meanings. That said, after inputing a few words, you get the hang of it.
Running the toplevel executable (make run
), it'll ask you to input commands of
the format
<guess> <row-spec> <col-spec>
Where <guess>
is the word you guessed, <row-spec>
is the response from the
game on the input row, and <col-spec>
is the response on the input column.
This records the new state of the game, at which point the bot suggests the next
word. So a playsession looks like this:
Guess your first word. I use crane
. See what the game responds, notate it on
the shell.
I hardcode the first three guesses, so I then use mould
. Record the response
to the bot.
Finally, I use fight
. Record the response.
After that, I use whatever word the bot selects for me, and record the answer.
My last playsession looked like this:
dune build src/squardle_solver.exe
./_build/default/src/squardle_solver.exe
Good luck!
Guess + results: crane w,y1,w,r1,r1 w,r1,y1,w,o11
We suggest: cacao
Guess + results: mould b,y1,w,b,r1 b,r1,w,b,w
We suggest: deuce
Guess + results: fight b,r1,r1,y1,b b,w,w,w,b
We suggest: rider
Guess + results: rider g,g,y1,w,y1 g,w,w,r1,r1
We suggest: cacao
Guess + results: cacao y1,g,g,y1,y1 r1,y1,g,w,g
We suggest: choke
Guess + results: choke w,g,g,w,g r1,w,y1,y1,g
We suggest: rigid
Guess + results: rigid g,g,g,g,g g,w,w,w,w
We suggest: gecko
Guess + results: gecko w,g,g,w,y1 g,g,g,g,g
We suggest: deuce
Guess + results: deuce w,g,g,w,g g,o11,w,g,g
We suggest: rebus
Guess + results: rebus g,g,g,g,g g,g,g,g,g
We suggest: bacon
Guess + results: bacon g,g,g,g,g g,g,g,g,g
We suggest: dance
Guess + results: dance g,g,g,w,g g,g,g,g,g
We suggest: rebus
Guess + results: rebus g,g,g,g,g g,g,g,g,g
We suggest: gecko
Guess + results: gecko g,g,g,g,g g,g,g,g,g
We suggest: shone
Guess + results: shone g,g,g,g,g g,g,g,g,g
The input spec is documented in cli.ml
, here.
I'll clean up this comment sometime, but at a high level:
For every spot in a 5-letter word, find characters that cannot exist in a
space (Black ones, White ones in your row or column, Red for columns or Yellow
for rows). Create a 5-character regex with those exclusions as a character
class (e.g. [^pen]
), and "pin" any solved squares into place. An example
generated regex might be ([^pen][^pen]av[^pen]
), where the 3rd and 4th
letters are av
and we have black or white tiles for p
and e
, n
. Use
this regex on the valid 5-letter words to winnow it down dramatically.
For that winnowed-down list, "score" the guess candidate by considering:
Return the highest-scoring word that isn't 50, or already solved.
Haven't tested reproducibility — I doubt this opam
file is enough to just
opam install .
in a new switch. Maybe later, Works On My Machine™
Two bugs in the modeling of gamestate: we don't grant extra turns on a solved
row or column (we don't use turn number for anything yet anyway), and if your
cursor lands on a solved row + col, we don't advanced to an unsolved one.
You'll see me use rebus
and gecko
above just to advance the cursor to an
unsolved row.
If you hit Enter with an invalid move spec, it crashes. It feels a bit brutal, but you can open a shell in a new pane and copy + paste the moves from the previous session pretty easily.
We don't use the number data on red, yellow, or orange at all. I suppose I could, but it's a lot more thinking/finicking than I want to invest.