Also, you really need better names for your methods and variables, starting with this bit here: https://github.com/KevinXuxuxu/wordle_machine/blob/64a8534ad...
As you think about a better way to name those, you will realize it is possible to do this in a much less convoluted way.
Hmmm, I have been using this Perl script:
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
my @words = grep # Add conditions below
!/^[A-Z]/,
grep length == 5,
map split, do { local $/; <> };
say for @words
Invoke it from the command line with your word list. I've been lazy, so I use `./wg /usr/share/dict/words` which means way more options than a more tailored word list would give which means I am only cheating a little. So, for example, I type "amber" as my first move and I am told "e" is in the wrong spot and none of the other letters match, I update the selection using that information: my @words = grep # Add conditions below
!/^...e/ &&
/e/ &&
!/[ambr]/ &&
!/^[A-Z]/,
grep length == 5,
map split, do { local $/; <> };These exercises are great at improving your intuition and aptitude for refactoring code in a way that makes it more maintainable, easier to read and reason about.
JSON.parse(window.localStorage.gameState).solutionThere’s only ~12k-13k five letter English words in the dictionary. Check /usr/share/dict/words file (if you use Windows, go find a dictionary file elsewhere).
The first word should be a word that roughly eliminates half the words, regardless of getting any letters right or wrong.
Count the letters in each position and calculate & rank the words that closely eliminates 1/2 the whole list. Use that as a filter and binary search until there’s only 1 word left.
Wordle is the same game as mastermind and hangman and wheel of fortune.
I’d argue Aeros is not the optimal first word in order to filter and binary search the list of five letter words. Homework to be left to the wordler.
Binary search isn’t the right answer here. You should be able to do far better than splitting things in half.
The greedy approach to solve this would be fairly simple. Find the next choice of n and letter that maximizes information gain recursively until the space is solved.
But a globally optimal approach would be pretty hard. At a minimum each letter has three color states so that’s 5^3 (125) groups of words that will be outputted by your result. The ideal first word, assuming your goal is to minimize average guesses, would try to get these groups as even as possible.
The theoretical perfect first word would thus get 96 possibilities (12000/125) left after a single guess but that’s probably not possible due to the grouping of words.
However a truly globally optimal setup only needs to guarantee that each outcome state has no more than 125 possibilities remaining, all of which are uniquely identifiable with a follow up word.
Damn, this sounds like a fun MIP challenge.