]> git.earman.xyz Git - sensor-watch.git/commitdiff
Include ability to select only the best words as the first choice
authorDavid Volovskiy <devolov@gmail.com>
Tue, 3 Sep 2024 21:09:52 +0000 (17:09 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Tue, 3 Sep 2024 21:09:52 +0000 (17:09 -0400)
movement/watch_faces/complication/wordle_face.h
movement/watch_faces/complication/wordle_face_dict.h
utils/wordle_face/wordle_list.py

index 1b9a7fb78ba5e0d185c8f7c295bac2d0bb1c073d..f390e736a2c32695755ed2c1a3ba7fa6494d1137 100644 (file)
@@ -81,6 +81,7 @@
  *  0 = Don't allow quickly choosing a random quess
  *  1 = Allow using a random guess of any value that can be an answer
  *  2 = Allow using a random guess of any value that can be an answer where all of its letters are unique
+ *  3 = Allow using a random guess of any value that can be an answer, and it's considered one of the best initial choices.
 */
 #define WORDLE_USE_RANDOM_GUESS 2
 #include "wordle_face_dict.h"
index 11a89f7523fb8c24729b64fa7876505049f65791..6b82976c8029e1bc23837d704abe99126a530ef9 100644 (file)
@@ -14,25 +14,25 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P
 // From: https://matthewminer.name/projects/calculators/wordle-words-left/
 // Number of words found: 432
 static const char _valid_words[][WORDLE_LENGTH + 1] = {
-    "STALE", "TRACE", "CLOSE", "ARISE", "SNIPE", "SHIRE", "LEASH", "SAINT", "CLEAN", 
-    "RELIC", "CHORE", "CRONE", "REACH", "CHAOS", "TAPIR", "CAIRN", "TENOR", "STARE", 
-    "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "SHARE", "SPOIL", 
+    "SLATE", "STARE", "SNARE", "SANER", "CRANE", "STALE", "CRATE", "RAISE", "TRACE", 
+    "SHARE", "ARISE", "SCARE", "SPARE", "CHAOS", "TAPIR", "CAIRN", "TENOR", "CLEAN", 
+    "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "RELIC", "SPOIL", 
     "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", 
-    "SHORT", "ETHIC", "CHANT", "ACTOR", "SPARE", "SEPIA", "ONSET", "SPLAT", "LEANT", 
+    "SHORT", "ETHIC", "CHANT", "ACTOR", "REACH", "SEPIA", "ONSET", "SPLAT", "LEANT", 
     "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", 
     "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", 
     "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", 
-    "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "SCARE", "ETHOS", "THEIR", "STONE", 
-    "SLATE", "LATCH", "HASTE", "SNARE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", 
+    "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "CRONE", "ETHOS", "THEIR", "STONE", 
+    "SHIRE", "LATCH", "HASTE", "CLOSE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", 
     "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", 
     "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", 
-    "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "RAISE", "POSIT", "ATONE", "SPIRE", 
+    "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "SAINT", "POSIT", "ATONE", "SPIRE", 
     "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", 
-    "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "SANER", "LEARN", "ALTER", 
+    "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "CHORE", "LEARN", "ALTER", 
     "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", 
     "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", 
     "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", 
-    "CANOE", "INTER", "CRATE", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", 
+    "CANOE", "INTER", "LEASH", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", 
     "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", 
     "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", 
     "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", 
@@ -41,7 +41,7 @@ static const char _valid_words[][WORDLE_LENGTH + 1] = {
     "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", 
     "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", 
     "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", 
-    "PAINT", "SPENT", "CRANE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", 
+    "PAINT", "SPENT", "SNIPE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", 
     "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", 
     "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", 
     "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", 
@@ -282,8 +282,10 @@ static const char _possible_words[][WORDLE_LENGTH + 1] = {
 #endif
 };
 
-#if (WORDLE_USE_RANDOM_GUESS == 2)
-static const uint16_t _num_random_guess_words = 257;  // The _valid_words array begins with this many words where each letter is different.
+#if (WORDLE_USE_RANDOM_GUESS == 3)
+static const uint16_t _num_random_guess_words = 13;  // The valid_words array begins with this many words that are considered the top 3% best options.
+#elif (WORDLE_USE_RANDOM_GUESS == 2)
+static const uint16_t _num_random_guess_words = 257;  // The valid_words array begins with this many words where each letter is different.
 #elif (WORDLE_USE_RANDOM_GUESS == 1)
 static const uint16_t _num_random_guess_words = _num_words;
 #endif
index 39e310c1c4c71ac1f8b190b8777c0465d6c328d8..dac5ad650e8f0ef1e062292f8893b34333c27bed 100644 (file)
@@ -1169,11 +1169,16 @@ def print_valid_words(letters=alphabet):
     print("#endif\n")\r
     \r
     items_per_row = 9\r
+    top_words_percent = 3\r
     valid_words = list_of_valid_words(letters, valid_list)\r
     valid_words = capitalize_all_and_remove_duplicates(valid_words)\r
     random.shuffle(valid_words) \r
     # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter\r
     valid_words, num_uniq = rearrange_words_by_uniqueness(valid_words)\r
+    best_words = list(best_first_word(letters=letters, print_result=False).keys())  \r
+    num_best_words = round(len(valid_words) * top_words_percent / 100)\r
+    for i in range(num_best_words, 0, -1):\r
+        valid_words.insert(0, valid_words.pop(valid_words.index(best_words[i-1])))\r
             \r
     print("static const char _valid_letters[] = {", end='')\r
     letters = sorted(letters)\r
@@ -1209,8 +1214,10 @@ def print_valid_words(letters=alphabet):
     print("#endif")\r
     print("};\n")\r
     \r
-    print("#if (WORDLE_USE_RANDOM_GUESS == 2)")\r
-    print(f"static const uint16_t _num_random_guess_words = {num_uniq};  // The _valid_words array begins with this many words where each letter is different.")\r
+    print("#if (WORDLE_USE_RANDOM_GUESS == 3)")\r
+    print(f"static const uint16_t _num_random_guess_words = {num_best_words};  // The valid_words array begins with this many words that are considered the top {top_words_percent}% best options.")\r
+    print("#elif (WORDLE_USE_RANDOM_GUESS == 2)")\r
+    print(f"static const uint16_t _num_random_guess_words = {num_uniq};  // The valid_words array begins with this many words where each letter is different.")\r
     print("#elif (WORDLE_USE_RANDOM_GUESS == 1)")\r
     print("static const uint16_t _num_random_guess_words = _num_words;")\r
     print("#endif")\r