diff --git a/solver.py b/solver.py index ab1c6b7..eaf3d00 100644 --- a/solver.py +++ b/solver.py @@ -3,80 +3,85 @@ import string from collections import defaultdict +import constraints import dictionary +import game -def analyze_dictionary(wordle_dictionary): - # Word Position, Letter: Count - position_matches = [ - defaultdict(int), - defaultdict(int), - defaultdict(int), - defaultdict(int), - defaultdict(int), - ] +class SimilaritySolver(object): + @staticmethod + def _analyze_dictionary(words): + # Word Position, Letter: Count + position_matches = [ + defaultdict(int), + defaultdict(int), + defaultdict(int), + defaultdict(int), + defaultdict(int), + ] - # Letter: Count - word_matches = defaultdict(int) + # Letter: Count + word_matches = defaultdict(int) - for word in wordle_dictionary: - unique_letters = set(word) - for letter in unique_letters: - word_matches[letter] += 1 + for word in words: + unique_letters = set(word) + for letter in unique_letters: + word_matches[letter] += 1 + for index in range(len(word)): + letter = word[index] + assert letter in string.ascii_lowercase + position_matches[index][letter] += 1 + + return position_matches, word_matches + + @staticmethod + def _score_word(position_matches, word_matches, word): + result = 0 + + # Green Score for index in range(len(word)): letter = word[index] - assert letter in string.ascii_lowercase - position_matches[index][letter] += 1 + green_score = position_matches[index][letter] + result += 10 * green_score - return position_matches, word_matches + # Yellow Score + for letter in set(word): + yellow_score = word_matches[letter] + result += yellow_score + return result -def score_word(position_matches, word_matches, word): - result = 0 + def scored_words(self, wordle_dictionary=dictionary.words()): + # word: score + scored_words = dict() - # Green Score - for index in range(len(word)): - letter = word[index] - green_score = position_matches[index][letter] - result += 10 * green_score + position_matches, word_matches = self._analyze_dictionary(wordle_dictionary) - # Yellow Score - for letter in set(word): - yellow_score = word_matches[letter] - result += yellow_score + for word in wordle_dictionary: + scored_words[word] = self._score_word(position_matches, word_matches, word) - return result + result = list(wordle_dictionary) + result.sort(key=lambda word: scored_words[word], reverse=True) - -def scored_words(wordle_dictionary=dictionary.words()): - # word: score - scored_words = dict() - - position_matches, word_matches = analyze_dictionary(wordle_dictionary) - - for word in wordle_dictionary: - scored_words[word] = score_word(position_matches, word_matches, word) - - result = list(wordle_dictionary) - result.sort(key=lambda word: scored_words[word], reverse=True) - - return [(word, scored_words[word]) for word in result] + return [(word, scored_words[word]) for word in result] if __name__ == "__main__": + solve = SimilaritySolver() + consts = constraints.Constraints() consts.update_graded( "cares", [ - solver.LetterResult.INCORRECT, - solver.LetterResult.INCORRECT, - solver.LetterResult.INCORRECT, - solver.LetterResult.INCORRECT, - solver.LetterResult.INCORRECT, + game.LetterResult.INCORRECT, + game.LetterResult.INCORRECT, + game.LetterResult.INCORRECT, + game.LetterResult.INCORRECT, + game.LetterResult.INCORRECT, ], ) valid_words = consts.filter_words(dictionary.words()) - print("Top: ", solver.scored_words(valid_words)[:5]) + print("Top: ", solve.scored_words(valid_words)[:5]) diff --git a/test_solver.py b/test_solver.py index 3ec8c0c..a362997 100644 --- a/test_solver.py +++ b/test_solver.py @@ -6,9 +6,11 @@ import solver class TestSolver(unittest.TestCase): - def test_scored_words(self): + def test_SimilaritySolver(self): """Minimal end to end test.""" - result = solver.scored_words() + + solve = solver.SimilaritySolver() + result = solve.scored_words() expected = [ ("cares", 139631),