Settings

Theme

Show HN: Simple Wordle solver in command line in Python

github.com

13 points by fzxu22 4 years ago · 15 comments

Reader

nanis 4 years ago

Correction: I thought this was script to solve Wordle puzzles, so I provided a cheat helper below. At first blush, I thought the idea was for the human to feed this script information back from Wordle so it could improve its guesses. Sigh

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 $/; <> };
  • fzxu22OP 4 years ago

    Thanks for the reply! I really appreciate your feedback on this. I wasn't giving much thought about coding style and naming etc. when I worked on this, just wanted to get it running asap. I'll definitely take a better look at your suggestion (I'm not very familiar with perl) and see if I find any time to improve this thing. cheers.

    • nanis 4 years ago

      My cheat script will not help with refactoring your code, but note that with a helper data structure, you do not need multiple passes over the guess to mark each letter in one of three states. Write down the process in human language first, then write the code to do the thing instead of immediately diving into the code and rearranging it until it produces the desired result.

      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.

TheRealNGenius 4 years ago

in my opinion, this misses the point of wordle

AnnikaL 4 years ago

it's much less algorithmically interesting, but you can also just run this in your browser console:

    JSON.parse(window.localStorage.gameState).solution
  • fzxu22OP 4 years ago

    LOL that's actually very useful as I'm trying to find out how the thing works

oneoff786 4 years ago

Is Aeros the entropy maximizing first guess?

  • bfung 4 years ago

    No need to “entropy maximize”.

    There’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.

    • oneoff786 4 years ago

      You basically described entropy maximization. But not quite. Eliminating words is just a piece of it, and the goal varies. are you trying to minimize the average number of guesses? Maximize the probability of getting it within N guesses? Etc.

      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.

      • bfung 4 years ago

        The goal in wordle or hangman is to guess the word within a set number of guesses.

        > minimize average number of guesses

        Yes, and it’s def much better than binary search, but the algorithm to arrive at the solution is optimal in that way — minimize the depth of the tree given a set of words/letters, with each branch being “correct letter position”, “correct letter”, or eliminate letter. No need to use abstract coloring concepts either.

        No real need for “ML” or anything.

        If someone had the time, they can prebuilt all the decision trees and pick the optimal words to as the starting word.

        Make a hangman solver was actually a take home interview question I had back in like 2009. Code it up, it’s a lot easier than it sounds.

        • oneoff786 4 years ago

          I think you’re missing what I’m saying. I’m not talking about ML. I’m taking about mixed integer programming. Minimizing the depth of the trees is the goal, not a method of getting there. Most discussion I see on this is on greedy methods that choose the first step that will maximize information gain and then the next best and so forth. But it’s possible there exists a first step that is less optimal up front but allows for more entropy on the second steps. I’m not sure if the greedy solutions are able to guarantee a three step solution for all possible words. Even if they are, it’s probable that they’re still inferior to the globally optimized answer.

  • fzxu22OP 4 years ago
fzxu22OP 4 years ago

see README

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection