From 5066813d0e376e73b85a9c448f0bac86e7d7ce29 Mon Sep 17 00:00:00 2001 From: Peter Norvig Date: Sat, 8 Jan 2022 22:27:26 -0800 Subject: [PATCH] Add files via upload --- ipynb/jotto.ipynb | 485 ++++++++++++++++++++++++++++------------------ 1 file changed, 299 insertions(+), 186 deletions(-) diff --git a/ipynb/jotto.ipynb b/ipynb/jotto.ipynb index b95d479..eae0737 100644 --- a/ipynb/jotto.ipynb +++ b/ipynb/jotto.ipynb @@ -202,17 +202,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"bolas\" Reply: 1; Consistent targets: 1119\n", - "Guess 2: \"dregs\" Reply: 2; Consistent targets: 443\n", - "Guess 3: \"exits\" Reply: 0; Consistent targets: 34\n", - "Guess 4: \"prong\" Reply: 1; Consistent targets: 6\n", - "Guess 5: \"darky\" Reply: 5; Consistent targets: 1\n" + "Guess 1: \"tempo\" Reply: 0; Consistent targets: 451\n", + "Guess 2: \"flick\" Reply: 0; Consistent targets: 67\n", + "Guess 3: \"hydra\" Reply: 3; Consistent targets: 21\n", + "Guess 4: \"hands\" Reply: 2; Consistent targets: 7\n", + "Guess 5: \"bawdy\" Reply: 2; Consistent targets: 4\n", + "Guess 6: \"guard\" Reply: 3; Consistent targets: 3\n", + "Guess 7: \"grays\" Reply: 5; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "5" + "7" ] }, "execution_count": 6, @@ -233,18 +235,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"shelf\" Reply: 2; Consistent targets: 981\n", - "Guess 2: \"lamed\" Reply: 3; Consistent targets: 152\n", - "Guess 3: \"velar\" Reply: 3; Consistent targets: 44\n", - "Guess 4: \"equal\" Reply: 2; Consistent targets: 17\n", - "Guess 5: \"veldt\" Reply: 4; Consistent targets: 2\n", - "Guess 6: \"loved\" Reply: 5; Consistent targets: 1\n" + "Guess 1: \"chard\" Reply: 2; Consistent targets: 833\n", + "Guess 2: \"frank\" Reply: 1; Consistent targets: 377\n", + "Guess 3: \"lased\" Reply: 3; Consistent targets: 91\n", + "Guess 4: \"decks\" Reply: 2; Consistent targets: 58\n", + "Guess 5: \"haves\" Reply: 2; Consistent targets: 44\n", + "Guess 6: \"mated\" Reply: 4; Consistent targets: 8\n", + "Guess 7: \"taxed\" Reply: 4; Consistent targets: 3\n", + "Guess 8: \"adept\" Reply: 5; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "6" + "8" ] }, "execution_count": 7, @@ -265,11 +269,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"agues\" Reply: 0; Consistent targets: 192\n", - "Guess 2: \"fitly\" Reply: 1; Consistent targets: 68\n", - "Guess 3: \"crimp\" Reply: 1; Consistent targets: 20\n", - "Guess 4: \"horny\" Reply: 2; Consistent targets: 6\n", - "Guess 5: \"plonk\" Reply: 2; Consistent targets: 1\n", + "Guess 1: \"chefs\" Reply: 0; Consistent targets: 420\n", + "Guess 2: \"junta\" Reply: 0; Consistent targets: 42\n", + "Guess 3: \"wimpy\" Reply: 1; Consistent targets: 10\n", + "Guess 4: \"dorky\" Reply: 3; Consistent targets: 3\n", + "Guess 5: \"glory\" Reply: 3; Consistent targets: 1\n", "Guess 6: \"world\" Reply: 5; Consistent targets: 1\n" ] }, @@ -341,13 +345,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "median: 7 guesses, mean: 7.36 ± 1.66, worst: 15, scores: 2,845\n", - "cumulative: ≤3:1%, ≤4:3%, ≤5:10%, ≤6:29%, ≤7:56%, ≤8:79%, ≤9:92%, ≤10:96%\n" + "median: 7 guesses, mean: 7.35 ± 1.68, worst: 16, scores: 2,845\n", + "cumulative: ≤3:1%, ≤4:3%, ≤5:11%, ≤6:31%, ≤7:57%, ≤8:79%, ≤9:91%, ≤10:96%\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -524,7 +528,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Finding Good Partitions\n", + "# Comparing Partitions\n", "\n", "What exactly is the best metric for deciding which partition is best? Ideally, we want the partition that minimizes the average number of additional guesses it will take to finish the game, but since we don't know that, we can instead minimize one of the following proxy metrics to rank partitions, based on the sizes of the branches:\n", "\n", @@ -724,11 +728,11 @@ "source": [ "@dataclass \n", "class Node:\n", - " \"\"\"A node in a tree. It stores the best guess, and a branch for every possible reply.\"\"\"\n", + " \"\"\"A node in a guess tree. It stores the best guess, and a branch for every possible reply.\"\"\"\n", " guess: Word\n", " branches: Dict[Reply, 'Tree']\n", "\n", - "Tree = Union[Node, Word] # A Tree is either an interior Node or a leaf Word" + "Tree = Union[Node, Word] # A Tree is either an interior Node or a leaf Word" ] }, { @@ -769,13 +773,13 @@ "outputs": [], "source": [ "words5 = ['purge', 'bites', 'sulky', 'patsy', 'hayed']\n", - "\n", "tree5 = minimizing_tree(max, words5)\n", "\n", "assert tree5 == Node(guess='bites', \n", " branches={1: Node(guess='purge', \n", " branches={1: Node(guess='sulky', \n", - " branches={1: 'hayed', 5: 'sulky'}), \n", + " branches={1: 'hayed', \n", + " 5: 'sulky'}), \n", " 5: 'purge'}), \n", " 2: 'patsy', \n", " 5: 'bites'})" @@ -822,9 +826,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Sample Jotto Games with Minimizing Guesser\n", - "\n", - "Here we build a tree that minimizes the maximum branch size (over the full wordlist), and use it to play a few games:" + "Here we build a tree that minimizes the maximum branch size (over the full wordlist) and make a guesser out of it:" ] }, { @@ -837,6 +839,13 @@ "guesser = TreeGuesser(tree)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sample Jotto Games with the Minimizing Guesser\n" + ] + }, { "cell_type": "code", "execution_count": 26, @@ -846,19 +855,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"wader\" Reply: 0; Consistent targets: 466\n", - "Guess 2: \"tings\" Reply: 1; Consistent targets: 142\n", - "Guess 3: \"hypos\" Reply: 3; Consistent targets: 32\n", - "Guess 4: \"clops\" Reply: 4; Consistent targets: 6\n", - "Guess 5: \"coups\" Reply: 4; Consistent targets: 2\n", - "Guess 6: \"comps\" Reply: 4; Consistent targets: 1\n", - "Guess 7: \"pocks\" Reply: 5; Consistent targets: 1\n" + "Guess 1: \"wader\" Reply: 2; Consistent targets: 1004\n", + "Guess 2: \"lawns\" Reply: 2; Consistent targets: 354\n", + "Guess 3: \"sutra\" Reply: 2; Consistent targets: 125\n", + "Guess 4: \"heaps\" Reply: 1; Consistent targets: 40\n", + "Guess 5: \"carny\" Reply: 3; Consistent targets: 12\n", + "Guess 6: \"bairn\" Reply: 5; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "7" + "6" ] }, "execution_count": 26, @@ -879,19 +887,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"wader\" Reply: 3; Consistent targets: 319\n", - "Guess 2: \"sword\" Reply: 2; Consistent targets: 112\n", - "Guess 3: \"weans\" Reply: 1; Consistent targets: 37\n", - "Guess 4: \"dicer\" Reply: 2; Consistent targets: 7\n", - "Guess 5: \"hydra\" Reply: 3; Consistent targets: 3\n", - "Guess 6: \"guard\" Reply: 4; Consistent targets: 1\n", - "Guess 7: \"fraud\" Reply: 5; Consistent targets: 1\n" + "Guess 1: \"wader\" Reply: 0; Consistent targets: 466\n", + "Guess 2: \"tings\" Reply: 2; Consistent targets: 160\n", + "Guess 3: \"gunky\" Reply: 2; Consistent targets: 44\n", + "Guess 4: \"plink\" Reply: 2; Consistent targets: 13\n", + "Guess 5: \"bonks\" Reply: 5; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "7" + "5" ] }, "execution_count": 27, @@ -912,19 +918,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"wader\" Reply: 1; Consistent targets: 1012\n", - "Guess 2: \"actin\" Reply: 2; Consistent targets: 355\n", - "Guess 3: \"flats\" Reply: 4; Consistent targets: 15\n", - "Guess 4: \"stalk\" Reply: 3; Consistent targets: 7\n", - "Guess 5: \"fault\" Reply: 4; Consistent targets: 3\n", - "Guess 6: \"aloft\" Reply: 3; Consistent targets: 1\n", - "Guess 7: \"tufas\" Reply: 5; Consistent targets: 1\n" + "Guess 1: \"wader\" Reply: 2; Consistent targets: 1004\n", + "Guess 2: \"lawns\" Reply: 2; Consistent targets: 354\n", + "Guess 3: \"sutra\" Reply: 2; Consistent targets: 125\n", + "Guess 4: \"heaps\" Reply: 2; Consistent targets: 43\n", + "Guess 5: \"eclat\" Reply: 2; Consistent targets: 13\n", + "Guess 6: \"hilar\" Reply: 0; Consistent targets: 3\n", + "Guess 7: \"wefts\" Reply: 4; Consistent targets: 1\n", + "Guess 8: \"owest\" Reply: 5; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "7" + "8" ] }, "execution_count": 28, @@ -936,6 +943,35 @@ "play(guesser)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Evaluating Guess Trees\n", + "\n", + "We could evaluate a Guess Tree with repeated calls to `play`, but there is a faster way: walk the tree and keep track of how many guesses it takes to get to each leaf word. The function `tree_scores` does this. For each subtree branch in the tree there are three cases:\n", + "- If the subtree is a leaf word that is the same as the node's guess, we're done; it took one guess.\n", + "- If the subtree is a leaf word that is not the guess, it took two guesses: one for the incorrect guess and one for the leaf word.\n", + "- If the subtree is a Node, add one to each of the scores from the subtree and yield those scores." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "def tree_scores(node: Node) -> Iterable[Score]:\n", + " \"\"\"All the scores for playing all the target words in the tree under `node`.\"\"\"\n", + " for subtree in node.branches.values():\n", + " if isinstance(subtree, Word):\n", + " yield 1 if subtree == node.guess else 2\n", + " else:\n", + " yield from (score + 1 for score in tree_scores(subtree))\n", + " \n", + "assert sorted(tree_scores(tree5)) == [1, 2, 2, 3, 4]" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -949,7 +985,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -969,22 +1005,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here we see that by default, `minimizing_tree` behaves just as it did before:" + "Here we see that by default, the redefined `minimizing_tree` behaves just as it did before:" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ - "assert minimizing_tree(max, words5) == (\n", - " Node(guess='bites', \n", - " branches={1: Node(guess='purge', \n", - " branches={1: Node(guess='sulky', \n", - " branches={1: 'hayed', 5: 'sulky'}), \n", - " 5: 'purge'}), \n", - " 2: 'patsy', 5: 'bites'}))" + "assert minimizing_tree(max, words5) == tree5" ] }, { @@ -996,7 +1026,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1005,7 +1035,7 @@ "Node(guess='dashy', branches={0: 'purge', 1: 'bites', 2: 'sulky', 3: 'patsy', 4: 'hayed'})" ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1019,59 +1049,145 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The first guess by `tree5i` is an inconsistent word (not one of the words in `words5`). There is no chance that this is the target, but it sets us up so that we will always be able to guess correctly on the second guess. So the minimum, mean, median, and maximum number of guesses is 2. \n", + "The first guess by `tree5i` is an inconsistent word, `'dashy'`. There is no chance that this is the target, but it sets us up so that after we get the reply we will always be able to guess correctly on the second guess. So the minimum, mean, median, and maximum number of guesses is 2. \n", "\n", "In contrast, `tree5` makes only consistent guesses and has a mean of 2.4 guesses and a maximum of 4:" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "median: 2 guesses, mean: 2.40 ± 1.14, worst: 4, scores: 5\n", + "cumulative: ≤3:80%, ≤4:100%, ≤5:100%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n" + ] + }, { "data": { + "image/png": "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\n", "text/plain": [ - "[2, 1, 3, 2, 4]" + "
" ] }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "[play(TreeGuesser(tree5), w, words5, False) # The 5 scores for tree5\n", - " for w in words5] " + "report(play(TreeGuesser(tree5), w, words5, False) for w in words5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Evaluating Guess Trees\n", - "\n", - "We could evaluate a Guess Tree with repeated calls to `play`, but there is a faster way: walk the tree and keep track of how many guesses it takes to get to each leaf word. The function `tree_scores` does this. For each subtree branch in the tree there are three cases:\n", - "- If the subtree is a leaf word that is the same as the node's guess, we're done; it took one guess.\n", - "- If the subtree is a leaf word that is not the guess, it took two guesses: one for the incorrect guess and one for the leaf word.\n", - "- If the subtree is a Node, add one to each of the scores from the subtree and yield those scores." + "As a more extreme example, consider the following list of 11 words, which differ only in the first letter. A consistent guesser could do no better than to just go through the list one at a time (in any order), and would be equally likely to guess right on any of guesses 1 through 11, for an average of 6:" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "median: 6 guesses, mean: 6.00 ± 3.32, worst: 11, scores: 11\n", + "cumulative: ≤3:27%, ≤4:36%, ≤5:45%, ≤6:55%, ≤7:64%, ≤8:73%, ≤9:82%, ≤10:91%\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ails = 'bails fails hails jails mails nails pails rails tails vails wails'.split()\n", + "\n", + "report(tree_scores(minimizing_tree(max, ails)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But an inconsistent guesser can make a first guess that partitions the remaining words, eventually leading to an average of only 4 guesses: " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "median: 4 guesses, mean: 4.00 ± 0.77, worst: 5, scores: 11\n", + "cumulative: ≤3:27%, ≤4:73%, ≤5:100%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "report(tree_scores(minimizing_tree(max, ails, inconsistent=True)))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ - "def tree_scores(node: Node) -> Iterable[Score]:\n", - " \"\"\"All the scores for playing all the target words in the tree under `node`.\"\"\"\n", - " for subtree in node.branches.values():\n", - " if isinstance(subtree, Word):\n", - " yield 1 if subtree == node.guess else 2\n", - " else:\n", - " yield from (score + 1 for score in tree_scores(subtree))\n", - " \n", - "assert sorted(tree_scores(tree5)) == [1, 2, 2, 3, 4]" + "assert (minimizing_tree(max, ails, inconsistent=True) == \n", + " Node(guess='front', \n", + " branches={0: Node(guess='thumb', \n", + " branches={0: Node(guess='power', \n", + " branches={0: Node(guess='jails', \n", + " branches={4: 'vails', \n", + " 5: 'jails'}), \n", + " 1: Node(guess='pails', \n", + " branches={4: 'wails', \n", + " 5: 'pails'})}), \n", + " 1: Node(guess='bails', \n", + " branches={4: Node(guess='hails', \n", + " branches={4: 'mails', \n", + " 5: 'hails'}), \n", + " 5: 'bails'})}), \n", + " 1: Node(guess='their', \n", + " branches={1: Node(guess='fails', \n", + " branches={4: 'nails', \n", + " 5: 'fails'}), \n", + " 2: Node(guess='rails', \n", + " branches={4: 'tails', \n", + " 5: 'rails'})})}))" ] }, { @@ -1085,7 +1201,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -1094,8 +1210,8 @@ "text": [ "median: 7 guesses, mean: 7.15 ± 1.81, worst: 18, scores: 2,845\n", "cumulative: ≤3:1%, ≤4:4%, ≤5:13%, ≤6:35%, ≤7:67%, ≤8:86%, ≤9:92%, ≤10:95%\n", - "CPU times: user 6.28 s, sys: 8.54 ms, total: 6.29 s\n", - "Wall time: 6.29 s\n" + "CPU times: user 6.71 s, sys: 17.1 ms, total: 6.73 s\n", + "Wall time: 6.76 s\n" ] }, { @@ -1117,7 +1233,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1126,8 +1242,8 @@ "text": [ "median: 7 guesses, mean: 7.14 ± 1.82, worst: 17, scores: 2,845\n", "cumulative: ≤3:1%, ≤4:4%, ≤5:13%, ≤6:36%, ≤7:68%, ≤8:85%, ≤9:91%, ≤10:95%\n", - "CPU times: user 6.38 s, sys: 14 ms, total: 6.4 s\n", - "Wall time: 6.4 s\n" + "CPU times: user 6.75 s, sys: 25.6 ms, total: 6.78 s\n", + "Wall time: 6.89 s\n" ] }, { @@ -1149,7 +1265,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1158,8 +1274,8 @@ "text": [ "median: 7 guesses, mean: 7.09 ± 1.78, worst: 19, scores: 2,845\n", "cumulative: ≤3:1%, ≤4:4%, ≤5:13%, ≤6:36%, ≤7:69%, ≤8:86%, ≤9:92%, ≤10:96%\n", - "CPU times: user 6.37 s, sys: 8.47 ms, total: 6.38 s\n", - "Wall time: 6.38 s\n" + "CPU times: user 6.68 s, sys: 18.8 ms, total: 6.7 s\n", + "Wall time: 6.73 s\n" ] }, { @@ -1188,22 +1304,22 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "median: 7 guesses, mean: 7.33 ± 1.67, worst: 16, scores: 2,845\n", - "cumulative: ≤3:1%, ≤4:4%, ≤5:11%, ≤6:30%, ≤7:58%, ≤8:80%, ≤9:91%, ≤10:96%\n", - "CPU times: user 6.71 s, sys: 7.95 ms, total: 6.72 s\n", - "Wall time: 6.72 s\n" + "median: 7 guesses, mean: 7.34 ± 1.73, worst: 18, scores: 2,845\n", + "cumulative: ≤3:1%, ≤4:4%, ≤5:12%, ≤6:29%, ≤7:57%, ≤8:80%, ≤9:91%, ≤10:96%\n", + "CPU times: user 6.9 s, sys: 26.7 ms, total: 6.92 s\n", + "Wall time: 6.95 s\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1229,7 +1345,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1238,8 +1354,8 @@ "text": [ "median: 7 guesses, mean: 7.05 ± 0.98, worst: 10, scores: 2,845\n", "cumulative: ≤3:0%, ≤4:1%, ≤5:6%, ≤6:24%, ≤7:69%, ≤8:95%, ≤9:99.9%, ≤10:100%\n", - "CPU times: user 28.3 s, sys: 25.1 ms, total: 28.3 s\n", - "Wall time: 28.3 s\n" + "CPU times: user 30.5 s, sys: 116 ms, total: 30.7 s\n", + "Wall time: 30.8 s\n" ] }, { @@ -1261,7 +1377,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1270,8 +1386,8 @@ "text": [ "median: 7 guesses, mean: 6.84 ± 0.95, worst: 10, scores: 2,845\n", "cumulative: ≤3:0%, ≤4:1%, ≤5:7%, ≤6:32%, ≤7:78%, ≤8:97%, ≤9:100.0%, ≤10:100%\n", - "CPU times: user 28.8 s, sys: 26.2 ms, total: 28.8 s\n", - "Wall time: 28.8 s\n" + "CPU times: user 29.7 s, sys: 39.8 ms, total: 29.7 s\n", + "Wall time: 29.7 s\n" ] }, { @@ -1293,7 +1409,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1302,8 +1418,8 @@ "text": [ "median: 7 guesses, mean: 6.82 ± 1.00, worst: 10, scores: 2,845\n", "cumulative: ≤3:0%, ≤4:1%, ≤5:8%, ≤6:35%, ≤7:78%, ≤8:97%, ≤9:99.6%, ≤10:100%\n", - "CPU times: user 29.6 s, sys: 20.5 ms, total: 29.6 s\n", - "Wall time: 29.6 s\n" + "CPU times: user 30 s, sys: 15.8 ms, total: 30 s\n", + "Wall time: 30 s\n" ] }, { @@ -1333,7 +1449,7 @@ "\n", "|

Algorithm|Consistent
Only
Mean (Max)|Inconsistent
Allowed
Mean (Max)|\n", "|--|--|--|\n", - "|random guesser|7.33 (16)| |\n", + "|random guesser|7.34 (18)| |\n", "|minimize max|7.15 (18)|7.05 (10)|\n", "|minimize expectation|7.14 (17)|6.84 (10)|\n", "|minimize neg_entropy|7.09 (19)|6.82 (10)|\n", @@ -1361,7 +1477,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -1389,7 +1505,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 45, "metadata": {}, "outputs": [], "source": [ @@ -1405,7 +1521,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -1427,7 +1543,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -1453,7 +1569,7 @@ " 'G.G.G': ['while']})" ] }, - "execution_count": 44, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1475,26 +1591,27 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"tikes\" Reply: Y..YY; Consistent targets: 62\n", - "Guess 2: \"saute\" Reply: G..YY; Consistent targets: 9\n", - "Guess 3: \"smelt\" Reply: G.GYG; Consistent targets: 1\n", - "Guess 4: \"slept\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"guess\" Reply: .....; Consistent targets: 954\n", + "Guess 2: \"batch\" Reply: .Y...; Consistent targets: 114\n", + "Guess 3: \"villa\" Reply: ....Y; Consistent targets: 26\n", + "Guess 4: \"drank\" Reply: .YYY.; Consistent targets: 3\n", + "Guess 5: \"apron\" Reply: GGGGG; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "4" + "5" ] }, - "execution_count": 45, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1505,17 +1622,17 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"astir\" Reply: .Y..Y; Consistent targets: 213\n", - "Guess 2: \"preps\" Reply: .YY.G; Consistent targets: 40\n", - "Guess 3: \"serfs\" Reply: .GG.G; Consistent targets: 13\n", - "Guess 4: \"heros\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"nurse\" Reply: .G.G.; Consistent targets: 8\n", + "Guess 2: \"gutsy\" Reply: .G.GG; Consistent targets: 5\n", + "Guess 3: \"pussy\" Reply: .GGGG; Consistent targets: 3\n", + "Guess 4: \"hussy\" Reply: GGGGG; Consistent targets: 1\n" ] }, { @@ -1524,7 +1641,7 @@ "4" ] }, - "execution_count": 46, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1535,25 +1652,27 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"tests\" Reply: .YY.G; Consistent targets: 38\n", - "Guess 2: \"slues\" Reply: GG.GG; Consistent targets: 1\n", - "Guess 3: \"sloes\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"dicey\" Reply: .Y.Y.; Consistent targets: 147\n", + "Guess 2: \"sepia\" Reply: .G.G.; Consistent targets: 14\n", + "Guess 3: \"kefir\" Reply: .G.GY; Consistent targets: 4\n", + "Guess 4: \"remit\" Reply: GGGG.; Consistent targets: 1\n", + "Guess 5: \"remix\" Reply: GGGGG; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "3" + "5" ] }, - "execution_count": 47, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1573,22 +1692,22 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "median: 4 guesses, mean: 4.64 ± 1.31, worst: 14, scores: 5,756\n", - "cumulative: ≤3:17%, ≤4:52%, ≤5:79%, ≤6:92%, ≤7:97%, ≤8:99%, ≤9:99.7%, ≤10:99.9%\n", - "CPU times: user 3min 26s, sys: 185 ms, total: 3min 27s\n", - "Wall time: 3min 30s\n" + "median: 4 guesses, mean: 4.63 ± 1.34, worst: 12, scores: 5,756\n", + "cumulative: ≤3:18%, ≤4:51%, ≤5:79%, ≤6:92%, ≤7:97%, ≤8:99%, ≤9:99.6%, ≤10:99.8%\n", + "CPU times: user 3min 6s, sys: 218 ms, total: 3min 7s\n", + "Wall time: 3min 7s\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1605,15 +1724,15 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3min 45s, sys: 147 ms, total: 3min 45s\n", - "Wall time: 3min 53s\n", + "CPU times: user 3min 3s, sys: 119 ms, total: 3min 3s\n", + "Wall time: 3min 6s\n", "median: 4 guesses, mean: 4.09 ± 1.20, worst: 12, scores: 5,756\n", "cumulative: ≤3:32%, ≤4:73%, ≤5:89%, ≤6:95%, ≤7:98%, ≤8:99.4%, ≤9:99.8%, ≤10:99.9%\n" ] @@ -1638,15 +1757,15 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 8min 54s, sys: 329 ms, total: 8min 54s\n", - "Wall time: 9min 14s\n", + "CPU times: user 8min 17s, sys: 420 ms, total: 8min 18s\n", + "Wall time: 8min 21s\n", "median: 4 guesses, mean: 3.82 ± 0.71, worst: 7, scores: 5,756\n", "cumulative: ≤3:32%, ≤4:87%, ≤5:98%, ≤6:99.9%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n" ] @@ -1675,7 +1794,7 @@ "source": [ "Pretty good! The Wordle web site challenges you to solve each puzzle in six guesses; we can now do that 99.9% of the time when inconsistent guesses are allowed, a big jump from the 95% without inconsistent guesses and the 92% with random consistent guesses. \n", "\n", - "This is all on the `sgb-words.txt` file. I poked around in the Wordle javascript, and I think I found the word list that they use. If I interpreted it correctly, my algorithm gets these results on it:\n", + "This is all on the `sgb-words.txt` file. I poked around in the Wordle javascript, trying to find the official Wordle word list. If I correctly interpreted what I found, my algorithm gets these results:\n", "\n", " median: 3 guesses, mean: 3.49 ± 0.60, worst: 6, scores: 2,315\n", " cumulative: ≤3:53%, ≤4:96%, ≤5:99.8%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n", @@ -1688,7 +1807,7 @@ "\n", "|


Algorithm|JOTTO
Consistent
Only
Mean (Max)|JOTTO
Inconsistent
Allowed
Mean (Max)|WORDLE
Consistent
Only
Mean (Max)|WORDLE
Inconsistent
Allowed
Mean (Max)|WORDLE
Official
Wordlist
Mean (Max)|\n", "|--|--|--|--|--|--|\n", - "|random guesser|7.33 (16)| ––––––– |4.64 (14) | ––––––– | 4.08 (8) |\n", + "|random guesser|7.34 (18)| ––––––– |4.63 (12) | ––––––– | 4.08 (8) |\n", "|minimize max|7.15 (18)|7.05 (10)| ––––––– | ––––––– | ––––––– | ––––––– |\n", "|minimize expectation|7.14 (17)|6.84 (10)| ––––––– | ––––––– | ––––––– | ––––––– |\n", "|minimize neg_entropy|7.09 (19)|6.82 (10)| 4.09 (12) | 3.82 (7) | 3.49 (6) |\n", @@ -1703,25 +1822,27 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"tares\" Reply: ..Y..; Consistent targets: 137\n", - "Guess 2: \"doing\" Reply: G.Y..; Consistent targets: 1\n", - "Guess 3: \"druid\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"tares\" Reply: YY..G; Consistent targets: 31\n", + "Guess 2: \"sloth\" Reply: G..G.; Consistent targets: 4\n", + "Guess 3: \"which\" Reply: .....; Consistent targets: 2\n", + "Guess 4: \"spats\" Reply: G.GGG; Consistent targets: 1\n", + "Guess 5: \"stats\" Reply: GGGGG; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "3" + "5" ] }, - "execution_count": 51, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1732,17 +1853,17 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"tares\" Reply: ..Y..; Consistent targets: 137\n", - "Guess 2: \"doing\" Reply: .Y...; Consistent targets: 18\n", - "Guess 3: \"clump\" Reply: ...G.; Consistent targets: 1\n", - "Guess 4: \"bromo\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"tares\" Reply: ..GY.; Consistent targets: 39\n", + "Guess 2: \"peony\" Reply: .YY..; Consistent targets: 5\n", + "Guess 3: \"fight\" Reply: G.Y..; Consistent targets: 1\n", + "Guess 4: \"forge\" Reply: GGGGG; Consistent targets: 1\n" ] }, { @@ -1751,7 +1872,7 @@ "4" ] }, - "execution_count": 52, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1762,25 +1883,27 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Guess 1: \"tares\" Reply: Y.Y..; Consistent targets: 32\n", - "Guess 2: \"fount\" Reply: .Y..G; Consistent targets: 1\n", - "Guess 3: \"orbit\" Reply: GGGGG; Consistent targets: 1\n" + "Guess 1: \"tares\" Reply: YY.YY; Consistent targets: 20\n", + "Guess 2: \"stalk\" Reply: YYG..; Consistent targets: 3\n", + "Guess 3: \"feast\" Reply: .GGGG; Consistent targets: 2\n", + "Guess 4: \"beast\" Reply: .GGGG; Consistent targets: 1\n", + "Guess 5: \"yeast\" Reply: GGGGG; Consistent targets: 1\n" ] }, { "data": { "text/plain": [ - "3" + "5" ] }, - "execution_count": 53, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1800,7 +1923,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -1850,8 +1973,8 @@ "immix 3543 | immix 2398 | immix -2.08\n", "yukky 3569 | gyppy 2401 | ahhhh -2.05\n", "gyppy 3636 | ohhhh 2476 | ohhhh -1.85\n", - "CPU times: user 10min 17s, sys: 409 ms, total: 10min 18s\n", - "Wall time: 10min 39s\n" + "CPU times: user 8min 36s, sys: 396 ms, total: 8min 36s\n", + "Wall time: 8min 36s\n" ] } ], @@ -1874,24 +1997,14 @@ " - Consider a Jotto game variant where each reply consists of two numbers: the number of letters in common with the target, and the number of letters that are in the exact correct position (as in Mastermind).\n", " - Implement [Mastermind](https://en.wikipedia.org/wiki/Mastermind_%28board_game%29). The default version has 6 colors and 4 pegs. Can you go beyond that?\n", " - Research what other computer scientists have done with [Jotto](https://arxiv.org/abs/1107.3342) or [Mastermind](http://serkangur.freeservers.com/).\n", + " - Refactor the code so it can smoothly handle multiple different games.\n", "- **Better strategy**:\n", " - Our `minimizing_tree` function is **greedy** in that it guesses the word that minimizes some metric of the current situation without looking ahead to future branches in the tree. Can you get better performance by doing some **look-ahead**? Perhaps with a beam search?\n", " - As an alternative to look-ahead, can you improve a tree by editing it? Given a tree, look for interior nodes that end up with a worse-than-expected average score, and see if the node can be replaced with something better (covering the same target words). Correcting a few bad nodes might be faster than carefully searching for good nodes in the first place.\n", - " - The metrics max, expectation, and negative entropy are all designed as proxies to what we really want to minimize: the average number of guesses. Can we estimate that directly? For example, we know a branch of size 1 has average 1; of size 2 has average 1.5; and of size 3 has average 1.5 if one of the words partitions the other two, otherwise an average of 2. Can we learn a function that takes a set of words as input and estimates the average number of guesses for the set?\n", + " - The three metrics (max, expectation, and negative entropy) are all designed as proxies to what we really want to minimize: the average number of guesses. Can we estimate that directly? For example, we know a branch of size 1 will always take 1 guess; of size 2 an average of 3/2 guesses; and of size 3 an average of 5/3 guesses if one of the words partitions the other two, otherwise an average of 2. Can we learn a function that takes a set of words as input and estimates the average number of guesses for the set?\n", " - Is it feasible to do a complete search and find the guaranteed optimal strategy? What optimizations to the code would be necessary? How long would the search take?\n", - "- **Code refactoring**:\n", - " - Refactor the code so it can smoothly handle multiple different games with different replies, etc.\n", "- **Chooser strategy**:\n", - " - Analyze the game where the chooser is not random, but rather is an adversary to the guesser–the chooser tries to choose a word that will maximize the guesser's score. What's a good strategy for the chooser? Is there a strategy equilibrium?\n", - "\n", - "One thing I thought of is to choose a word for which one of the spots can be filled by many letters, such as: \n", - "\n", - " bills cills dills fills gills hills jills kills lills mills nills pills rills sills tills vills wills yills zills\n", - " aight bight dight eight fight hight kight light might night pight right sight tight wight\n", - " backs cacks dacks hacks jacks kacks lacks macks packs racks sacks tacks wacks yacks zacks\n", - " bangs cangs dangs fangs gangs hangs kangs mangs pangs rangs sangs tangs vangs wangs yangs\n", - " bests fests gests hests jests kests lests nests pests rests tests vests wests yests zests\n", - " bines cines dines fines kines lines mines nines pines rines sines tines vines wines zines\n" + " - Analyze the game where the chooser is not random, but rather is an adversary to the guesser–the chooser tries to choose a word that will maximize the guesser's score. What's a good strategy for the chooser? Is there a strategy equilibrium? (One thing I thought of is to choose a word like one of the `ails` words that has many other words that are off by one letter.) \n" ] } ],