Files
Wordle_Solver/wordle_tester.py
2022-05-03 20:32:58 -05:00

117 lines
4.2 KiB
Python

import wordle_solver
def wordle_guess(not_letters, has_letters, position_letters, not_position_letters, guesses = None):
if guesses == None:
input_file_path = 'cleaned_wordle_words.txt'
dictionary = open(input_file_path, 'r')
guesses = wordle_solver.read_in_dict(dictionary)
dictionary.close()
guesses = wordle_solver.words_without_letters(not_letters, guesses)
guesses = wordle_solver.words_with_letters(has_letters, guesses)
guesses = wordle_solver.words_with_letter_positions(position_letters, guesses)
guesses = wordle_solver.words_letter_not_position(not_position_letters, guesses)
dict_stats = wordle_solver.get_dict_stats(guesses)
wordle_solver.entropy_sort_list(guesses, dict_stats)
return guesses
def check_guess(guess, word, not_letters, has_letters, position_letters, not_position_letters):
for i, letter in enumerate(guess):
if letter in word and letter not in has_letters:
has_letters += letter
elif letter not in not_letters and letter not in has_letters:
not_letters += letter
if letter == word[i]:
position_letters = position_letters[:i] + letter + position_letters[i+1:]
if letter in word and word[i] != letter:
if letter not in not_position_letters:
new_letter_list = [False] * 5
new_letter_list[i] = True
not_position_letters[letter] = new_letter_list
else:
not_position_letters[letter][i] = True
return not_letters, has_letters, position_letters, not_position_letters
def get_word_stats(word, dictionary_path):
words =[word]
total_num_guesses = 0
not_letters = ""
has_letters = ""
position_letters = "_____"
not_position_letters = {}
guesses = []
total_words = 0
percentage = 0
last_percentage = 0
dictionary = open(dictionary_path, 'r')
guess = wordle_solver.read_in_dict(dictionary)
dictionary.close()
for total_words, word in enumerate(words):
for x in range(20):
total_num_guesses += 1
guess = wordle_guess(not_letters, has_letters, position_letters, not_position_letters, guesses=guess)
if len(guess) == 0:
print("No more guesses")
exit()
new_guess = guess[0]
i = 0
while new_guess in guesses:
new_guess = guess[i]
i += 1
not_letters, has_letters, position_letters, not_position_letters = \
check_guess(new_guess, word, not_letters, has_letters, position_letters, not_position_letters)
guesses.append(new_guess)
if position_letters == word:
percentage = round(total_words*100/len(words), 0)
if percentage - last_percentage >= 5:
print(str(percentage) + r"% finished with", word[0])
last_percentage = percentage
not_letters = ""
has_letters = ""
position_letters = "_____"
guesses = []
not_position_letters = {}
break
return total_num_guesses
if __name__ == "__main__":
import multiprocessing as mul
from time import time
alphabet = list("ab")
input_file_path = 'cleaned_wordle_words.txt'
dictionary = open(input_file_path, 'r')
words = wordle_solver.read_in_dict(dictionary)
dictionary.close()
timer = time()
testers = mul.Pool()
total_guesses = 0
results = []
for i, word in enumerate(words):
results.append(testers.apply_async(get_word_stats, (word,input_file_path,)))
if i % 100 == 0:
print(i, "words tested")
print("Recovering Results")
for i, result in enumerate(results):
try:
total_guesses += result.get(timeout=1)
if i % 100 == 0:
print(i, "results recovered. Current average:", total_guesses/(i+1))
except mul.TimeoutError:
print("Timed out")
print("Time taken:", time() - timer)
print("The average number of guesses per word is " + str(total_guesses/len(words)))