Skip to content

Commit 3ddfb3a

Browse files
committed
Algorithm changes
1 parent 2e2023f commit 3ddfb3a

File tree

1 file changed

+53
-35
lines changed

1 file changed

+53
-35
lines changed

wordle_solver/wordle_solver.py

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@
1313
import time
1414

1515

16+
class Finder:
17+
def __init__(self):
18+
self.possible_words = get_list_of_words()
19+
self.absent_letters = set([])
20+
self.present_letters = set([])
21+
self.word = [''] * 5
22+
23+
1624
def on_release(key):
1725
# Start button
1826
if key == keyboard.Key.esc:
@@ -21,19 +29,19 @@ def on_release(key):
2129

2230
def get_row_results(game_row):
2331
tiles = game_row.find_elements(By.CLASS_NAME, "Tile-module_tile__3ayIZ")
24-
evaluation = []
25-
eval_to_int = {
32+
row_results = []
33+
res_to_int = {
2634
"correct": 1,
2735
"present": 0,
2836
"absent": -1,
2937
"empty": -2,
3038
"tbd": -3
3139
}
3240
for tile in tiles:
33-
evaluation.append(eval_to_int[tile.get_attribute("data-state")])
34-
print(evaluation)
41+
row_results.append(res_to_int[tile.get_attribute("data-state")])
42+
print(row_results)
3543

36-
return tuple(evaluation)
44+
return tuple(row_results)
3745

3846

3947
def enter_word(word):
@@ -71,6 +79,13 @@ def check_letter_in_word(letter, word):
7179
return False
7280

7381

82+
def check_match(finder_word_letter, possible_word_letter):
83+
if finder_word_letter == possible_word_letter:
84+
return True
85+
else:
86+
return False
87+
88+
7489
# From the basic list of words, return all the words with 5 characters.
7590
def get_list_of_words():
7691
list_of_words = open("words_alpha.txt", "r").read().strip().splitlines()
@@ -90,7 +105,7 @@ def get_list_of_words():
90105
# letters_not_in_response, is a list which keeps track of the allowed letters
91106
# letter_not_in_position, is a list which keeps track of the letters in bad position
92107
# For exemple, "A_A_*A", letters_not_in_response = ['B'], letter_not_in_position = ['K'].
93-
def solving_algorithm(word, res, list_of_words, present_letters, absent_letters):
108+
def solving_algorithm(word, res, finder):
94109
print("solving_algorithm start")
95110

96111
solving_string = "*****"
@@ -100,48 +115,51 @@ def solving_algorithm(word, res, list_of_words, present_letters, absent_letters)
100115
if res[letter] == 1: # Case when the status of the letter is "correct"
101116
print("the letter is correct")
102117
solving_string = solving_string[:letter] + word[letter] + solving_string[letter + 1:]
103-
if word[letter] in present_letters:
104-
present_letters.remove(word[letter])
118+
finder.word[letter] = word[letter]
119+
print(finder.word)
105120
elif res[letter] == 0: # Case when the status of the letter is "present" (present but at the wrong position)
106121
print("the letter is present")
122+
finder.present_letters.add(word[letter])
107123
solving_string = solving_string[:letter] + "_" + solving_string[letter + 1:]
108-
present_letters.add(word[letter])
109124
else: # Case when the status of the letter is "absent"
110125
print("the letter is absent")
111-
if word[letter] not in present_letters:
112-
absent_letters.add(word[letter])
126+
if word[letter] not in finder.present_letters:
127+
finder.absent_letters.add(word[letter])
113128
solving_string = solving_string[:letter] + "*" + solving_string[letter + 1:]
114129

115130
print("Update list of words")
116-
print("length of list", len(list_of_words))
131+
print("length of list", len(finder.possible_words))
117132

118133
# Update list of words
119-
for absent in absent_letters:
120-
print(absent)
121-
list_of_words = list(filter(lambda x_word: not check_letter_in_word(absent, x_word), list_of_words))
122-
for present in present_letters:
123-
print(present)
124-
list_of_words = list(filter(lambda x_word: check_letter_in_word(present, x_word), list_of_words))
125-
126-
print("letter not in the right position : ", present_letters)
127-
print(create_regex(solving_string, present_letters))
128-
print("Letters with absent status", absent_letters)
129-
print("solving string :", solving_string)
130-
print("list of words : ", list_of_words)
131-
print("length of list", len(list_of_words))
134+
for absent in finder.absent_letters:
135+
finder.possible_words = list(
136+
filter(lambda x_word: not check_letter_in_word(absent, x_word), finder.possible_words))
137+
for present in finder.present_letters:
138+
finder.possible_words = list(
139+
filter(lambda x_word: check_letter_in_word(present, x_word), finder.possible_words))
140+
for i in range(len(finder.word)):
141+
if finder.word[i] != "":
142+
finder.possible_words = list(
143+
filter(lambda x_word: check_match(x_word[i], finder.word[i]), finder.possible_words))
132144

133-
return list_of_words
145+
print("letter not in the right position : ", finder.present_letters)
146+
print("Letters with absent status", finder.absent_letters)
147+
print("list of words : ", finder.possible_words)
148+
print("length of list", len(finder.possible_words))
149+
150+
regex = create_regex(solving_string, finder.present_letters) # Create the regex
151+
print(create_regex(solving_string, finder.present_letters))
152+
153+
# print("solving string :", solving_string)
134154

135155

136156
def main():
137157
# Start the browser
138158
browser = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
139159
browser.get("https://www.nytimes.com/games/wordle/index.html")
140160

141-
list_of_words = get_list_of_words()
142-
absent_letters = set([])
143-
present_letters = set([])
144-
guesses_left = 2
161+
finder = Finder()
162+
guesses_left = 6
145163

146164
# Wait for start
147165
with keyboard.Listener(on_release=on_release, suppress=True) as listener:
@@ -155,18 +173,18 @@ def main():
155173
# Get the game rows
156174
game_rows = browser.find_elements(By.CLASS_NAME, 'Row-module_row__dEHfN')
157175

158-
first_string = "tests"
176+
first_string = "slate"
159177
enter_word(first_string)
160178
res = get_row_results(game_rows[0])
161-
list_of_words = solving_algorithm(first_string, res, list_of_words, present_letters, absent_letters)
179+
solving_algorithm(first_string, res, finder)
162180
guesses_left -= 1
163181

164182
time.sleep(1)
165183

166184
for i in range(guesses_left, 0, -1):
167-
enter_word(list_of_words[0])
168-
res = get_row_results(game_rows[i])
169-
solving_algorithm(list_of_words[0], res, list_of_words, present_letters, absent_letters)
185+
enter_word(finder.possible_words[0])
186+
res = get_row_results(game_rows[guesses_left + 1 - i])
187+
solving_algorithm(finder.possible_words[0], res, finder)
170188
time.sleep(1)
171189

172190

0 commit comments

Comments
 (0)