|
Thanks for sharing your code. I had seen other people also mention that these 5 guesses (AESIR, ARISE, RAISE, REAIS, SERAI) all narrow down the list to 168 (in the worst case), but I was curious why the code I wrote to play with this was giving different answers. After reading your code, I see an error in it. In fact, only RAISE is optimal; the others are worse, and leave bigger lists (according to my code): RAISE: 168
…
REAIS: 203
…
AESIR: 220
ARISE: 220
…
SERAI: 241
The error in your code is that your "evaluateGuess" function (right at the top, in the first 10 or so lines of https://github.com/christiangenco/wordlesolver/blob/9c3bd94a...): function evaluateGuess({ solution, guess }) {
return [...guess].map((letter, index) => {
return {
letter,
included: solution.includes(letter),
position: letter === solution[index],
};
});
}
is too simplistic, and not actually what the real game does. In the game, for each letter position, there are three possible responses:• Correct (Green), what you call "position" • Present (Yellow), what you call "included" • Absent (Grey) Here are three test cases, that you could try out on the real Wordle in recent days: • When the solution is "FAVOR" and our guess is "ERROR", Wordle's response is [Grey, Grey, Grey, Green, Green] — note that for the first two Rs in "ERROR", the correct response is Grey (Absent), because the last R has already "used up" the "Green" response. • When the solution is "FAVOR" and our guess is "ROARS", Wordle's response is [Yellow, Yellow, Yellow, Grey, Grey] — note that only the first R in "ROARS" gets a Yellow response and the second one gets Grey, because there's only one R in the solution. • (As pointed out by @pedrosorio in a sibling comment) When the solution is "ABBEY" and our guess is "APNEA", Wordle's response is [Green, Grey, Grey, Green, Grey], but your solver thinks that the second "A" would get a "Yellow" response too. You mentioned Donald Knuth's Mastermind paper; in fact in the paper (http://www.cs.uni.edu/~wallingf/teaching/cs3530/resources/kn...) Knuth points this out on the very first page: > Rule 2 is somewhat difficult to state precisely and unambiguously, and the manufacturers have in fact not succeeded in doing so on the directions they furnish with the game […] and gives an exact rule that you may want to study carefully. In my code, the `response` function I use (it's not the most efficient, but we can just memoize it) is: def response(h, g):
'''
- The hidden word is h.
- The guess is g.
For each position in the word g, some color:
- 'green' if in the same position
- 'yellow' if present (after subtracting 'green's)
- 'grey' if absent (after subtracting "green"s and "yellow"s)
'''
assert len(h) == len(g)
L = len(h)
green = [i for i in range(L) if h[i] == g[i]]
yellow = []
for i in range(L):
# We want to check whether g[i] is "present" in h
if i in green: continue
for j in range(L):
if j in green: continue
if j in yellow: continue
if h[j] == g[i]:
yellow.append(i)
break
return (green, yellow)
Note the three "continue" statements — they are crucial, to match the behaviour of the real Wordle (or Master Mind) on the three test cases I mentioned above. |