Last active
January 27, 2022 16:10
-
-
Save thejevans/068f12e591df47239a849b7bee1d9552 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Collecting emoji\n", | |
" Downloading emoji-1.6.3.tar.gz (174 kB)\n", | |
"\u001b[K |████████████████████████████████| 174 kB 12.7 MB/s eta 0:00:01\n", | |
"\u001b[?25hBuilding wheels for collected packages: emoji\n", | |
" Building wheel for emoji (setup.py) ... \u001b[?25ldone\n", | |
"\u001b[?25h Created wheel for emoji: filename=emoji-1.6.3-py3-none-any.whl size=170281 sha256=c4e72636fdb6cfed9dce4c5249910685788509f1d24b82674af0bcee034eebe3\n", | |
" Stored in directory: /home/jevans96/.cache/pip/wheels/7d/09/45/1ad33b3ac1e05d07355a3c81fe56c89837774fdb6665574765\n", | |
"Successfully built emoji\n", | |
"Installing collected packages: emoji\n", | |
"Successfully installed emoji-1.6.3\n", | |
"Note: you may need to restart the kernel to use updated packages.\n" | |
] | |
} | |
], | |
"source": [ | |
"pip install emoji" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import json\n", | |
"import emoji\n", | |
"import numpy as np\n", | |
"from collections import Counter" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"with open('./words.json', 'r') as f:\n", | |
" words = json.load(f)\n", | |
" \n", | |
"dictionary = words['solutions']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def word_possible(guessed_word, results, word_to_check):\n", | |
" for i, (letter, result) in enumerate(zip(guessed_word, results)):\n", | |
" if result == 0 and letter in word_to_check:\n", | |
" return 0\n", | |
" if result == 1 and (word_to_check[i] == letter or letter not in word_to_check):\n", | |
" return 0\n", | |
" if result == 2 and not word_to_check[i] == letter:\n", | |
" return 0\n", | |
" return 1\n", | |
"\n", | |
"def get_results_set(guessed_word, dictionary):\n", | |
" results_list = []\n", | |
" for word in dictionary:\n", | |
" if word == guessed_word:\n", | |
" continue\n", | |
" results = [0, 0, 0, 0, 0]\n", | |
" for i, letter in enumerate(guessed_word):\n", | |
" if letter == word[i]:\n", | |
" results[i] = 2\n", | |
" elif letter in word:\n", | |
" results[i] = 1\n", | |
" results_list.append(tuple(results))\n", | |
" return Counter(results_list)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"results_counters = {word: get_results_set(word, dictionary) for word in dictionary}\n", | |
"results_sets = {word: tuple(counter) for word, counter in results_counters.items()}\n", | |
"results_weights = {\n", | |
" word: [val/len(dictionary) for _, val in counter.items()]\n", | |
" for word, counter in results_counters.items()\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"scores = {\n", | |
" word: [\n", | |
" sum([word_possible(word, results, dict_word) for dict_word in dictionary])\n", | |
" for results in results_set\n", | |
" ] for word, results_set in results_sets.items()\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" word weighted mean possible words after guess\n", | |
"raise: 61.03\n", | |
"arise: 63.75\n", | |
"irate: 63.81\n", | |
"arose: 66.05\n", | |
"alter: 70.02\n", | |
"saner: 70.16\n", | |
"later: 70.25\n", | |
"snare: 71.13\n", | |
"stare: 71.32\n", | |
"slate: 71.60\n", | |
".\n", | |
".\n", | |
".\n", | |
"woozy: 688.59\n", | |
"jazzy: 702.12\n", | |
"fluff: 723.86\n", | |
"fizzy: 728.34\n", | |
"jiffy: 735.07\n", | |
"civic: 737.23\n", | |
"puppy: 778.19\n", | |
"mamma: 791.62\n", | |
"vivid: 816.97\n", | |
"mummy: 821.09\n" | |
] | |
} | |
], | |
"source": [ | |
"means = {\n", | |
" word: np.average(score, weights=results_weights[word])\n", | |
" for word, score in scores.items()\n", | |
"}\n", | |
"print(' word weighted mean possible words after guess')\n", | |
"for mean, word in sorted((value,key) for (key,value) in means.items())[:10]:\n", | |
" print(f'{word}: {mean:.2f}')\n", | |
"print('.')\n", | |
"print('.')\n", | |
"print('.')\n", | |
"for mean, word in sorted((value,key) for (key,value) in means.items())[-11:-1]:\n", | |
" print(f'{word}: {mean:.2f}')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def emoji_results(results):\n", | |
" emoji_map = {\n", | |
" 0: ':black_large_square:',\n", | |
" 1: ':yellow_square:',\n", | |
" 2: ':green_square:',\n", | |
" }\n", | |
" return emoji.emojize(''.join([emoji_map[i] for i in results]))\n", | |
"\n", | |
"raise_dictionaries = {\n", | |
" results: [word for word in dictionary if word_possible('raise', results, word)]\n", | |
" for results in results_sets['raise']\n", | |
"}\n", | |
"\n", | |
"strs = []\n", | |
"lens = []\n", | |
"for results, raise_dict in raise_dictionaries.items():\n", | |
" if len(raise_dict) == 1:\n", | |
" best_choice = (0, raise_dict)\n", | |
" else:\n", | |
" raise_results_counters = {\n", | |
" word: get_results_set(word, raise_dict) for word in raise_dict\n", | |
" }\n", | |
" raise_results_sets = {\n", | |
" word: tuple(counter) for word, counter in raise_results_counters.items()\n", | |
" }\n", | |
" raise_results_weights = {\n", | |
" word: [val/len(raise_dict) for _, val in counter.items()]\n", | |
" for word, counter in raise_results_counters.items()\n", | |
" }\n", | |
" raise_scores = {\n", | |
" word: [\n", | |
" sum([word_possible(word, results, dict_word) for dict_word in raise_dict])\n", | |
" for results in results_set\n", | |
" ] for word, results_set in raise_results_sets.items()\n", | |
" }\n", | |
" raise_means = {\n", | |
" word: np.average(score, weights=raise_results_weights[word])\n", | |
" for word, score in raise_scores.items()\n", | |
" }\n", | |
" best = sorted((value,key) for (key,value) in raise_means.items())\n", | |
" best_words = [word for mean, word in best if mean == best[0][0]]\n", | |
" best_choice = (best[0][0], best_words)\n", | |
" \n", | |
" strs.append(\n", | |
" f'{emoji_results(results)}\\t{len(raise_dict)}\\t{best_choice[0]:.2f}\\t\\t{\" \".join(best_choice[1])}')\n", | |
" lens.append(len(raise_dict))\n", | |
"\n", | |
"idxs = np.argsort(lens)[::-1]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 53, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"first result\tleft\texpected\tbest words\n", | |
"⬛⬛⬛⬛⬛\t168\t6.31\t\tcould\n", | |
"⬛⬛⬛⬛🟨\t121\t5.15\t\tolden\n", | |
"⬛⬛🟨⬛⬛\t107\t6.43\t\tpilot\n", | |
"🟨⬛⬛⬛⬛\t103\t6.20\t\ttruly\n", | |
"🟨⬛⬛⬛🟨\t102\t8.76\t\touter\n", | |
"⬛🟨⬛⬛⬛\t92\t4.21\t\tcloak\n", | |
"⬛🟩⬛⬛⬛\t91\t7.56\t\ttangy\n", | |
"⬛⬛⬛🟨⬛\t80\t4.90\t\tstunk\n", | |
"🟨🟨⬛⬛⬛\t78\t5.81\t\tacorn\n", | |
"⬛🟨⬛⬛🟨\t69\t3.38\t\tcleat\n", | |
"⬛⬛⬛⬛🟩\t61\t4.23\t\tlunge\n", | |
"⬛⬛🟩⬛⬛\t51\t3.64\t\tcling\n", | |
"⬛🟨⬛🟨⬛\t43\t3.00\t\tstalk\n", | |
"⬛🟨⬛⬛🟩\t41\t4.85\t\tplate\n", | |
"⬛⬛⬛🟨🟨\t41\t2.25\t\tspelt\n", | |
"🟨⬛⬛⬛🟩\t40\t4.18\t\tprove\n", | |
"⬛⬛🟨⬛🟨\t35\t2.65\t\twiden\n", | |
"🟨🟨⬛⬛🟨\t34\t3.55\t\ttread\n", | |
"⬛🟨🟨⬛⬛\t34\t2.39\t\ttidal\n", | |
"⬛⬛🟩🟨⬛\t29\t3.36\t\tstink\n", | |
"🟨🟩⬛⬛🟨\t28\t7.00\t\ttaper\n", | |
"🟨⬛🟩⬛⬛\t28\t4.33\t\tprint\n", | |
"🟨🟩⬛⬛⬛\t26\t3.96\t\tparty\n", | |
"🟨🟨⬛⬛🟩\t26\t3.88\t\tgrace\n", | |
"🟨⬛🟨⬛🟨\t26\t4.36\t\tdiner\n", | |
"⬛🟩⬛⬛🟩\t26\t4.68\t\tcable\n", | |
"⬛⬛🟨⬛🟩\t25\t3.75\t\tbinge\n", | |
"🟨⬛⬛🟨⬛\t24\t2.30\t\tshort\n", | |
"🟨⬛🟨⬛⬛\t23\t1.91\t\tdroit\n", | |
"⬛⬛🟩⬛🟩\t23\t4.27\t\tutile\n", | |
"⬛🟨⬛🟩⬛\t22\t3.29\t\tslash\n", | |
"🟨🟨⬛🟨⬛\t21\t3.00\t\tstrap\n", | |
"⬛⬛🟨🟨⬛\t21\t1.90\t\tstoic\n", | |
"⬛🟨⬛🟨🟩\t20\t5.32\t\tslate\n", | |
"⬛🟩⬛⬛🟨\t20\t3.74\t\tnavel\n", | |
"🟩⬛⬛⬛🟨\t20\t3.00\t\truler\n", | |
"⬛🟩⬛🟨⬛\t20\t2.37\t\tsalon\n", | |
"⬛⬛⬛🟩🟩\t20\t3.32\t\tloose\n", | |
"🟨⬛⬛🟨🟨\t18\t2.76\t\tshrew\n", | |
"🟨🟨🟨⬛⬛\t18\t2.29\t\ttrail\n", | |
"⬛⬛⬛🟨🟩\t17\t2.75\t\tstone\n", | |
"🟨⬛🟩⬛🟩\t17\t4.75\t\ttripe\n", | |
"⬛⬛⬛🟩⬛\t17\t1.75\t\tblush\n", | |
"⬛⬛🟩⬛🟨\t15\t2.14\t\tedict\n", | |
"⬛⬛🟩🟨🟩\t15\t4.57\t\tsnipe spine\n", | |
"⬛🟩🟨⬛⬛\t14\t2.08\t\tpanic\n", | |
"🟩🟨⬛⬛🟨\t13\t2.17\t\trelay\n", | |
"🟨⬛⬛🟩⬛\t13\t1.33\t\tcrust\n", | |
"⬛🟨⬛🟨🟨\t12\t1.73\t\tsteak\n", | |
"🟨⬛🟩⬛🟨\t12\t2.27\t\tfried\n", | |
"⬛🟨🟩⬛⬛\t12\t1.55\t\talign axion\n", | |
"🟨⬛⬛🟨🟩\t10\t3.44\t\tscree spree\n", | |
"🟩⬛⬛⬛⬛\t10\t1.44\t\truddy\n", | |
"🟩🟩⬛⬛⬛\t9\t2.00\t\trandy rayon\n", | |
"⬛⬛🟩🟩⬛\t9\t2.00\t\thoist\n", | |
"⬛⬛⬛🟩🟨\t9\t2.00\t\tguess\n", | |
"⬛🟩⬛🟨🟩\t9\t3.50\t\tcaste sauce\n", | |
"🟩⬛🟨⬛🟨\t8\t2.14\t\triper river rivet\n", | |
"⬛🟨⬛🟩🟩\t8\t1.86\t\tcease\n", | |
"🟨⬛⬛🟩🟩\t8\t3.00\t\tcurse nurse prose purse\n", | |
"🟨🟨⬛🟩⬛\t8\t2.14\t\tbrash brass crash crass grass\n", | |
"⬛🟩⬛🟩⬛\t7\t1.67\t\tpalsy\n", | |
"⬛🟨🟨🟨⬛\t7\t1.00\t\tslain snail stain\n", | |
"🟨⬛⬛🟩🟨\t7\t1.67\t\tcress\n", | |
"🟩⬛⬛⬛🟩\t6\t1.00\t\trogue\n", | |
"🟩🟩🟨⬛⬛\t6\t1.40\t\trabid radii radio rapid\n", | |
"⬛🟩🟩⬛⬛\t6\t1.80\t\tfaint faith paint taint\n", | |
"⬛⬛🟨🟩⬛\t6\t1.40\t\ttipsy\n", | |
"⬛🟨⬛🟩🟨\t5\t2.50\t\tbeast feast leash least yeast\n", | |
"🟨⬛🟩🟨⬛\t5\t1.00\t\tshirk\n", | |
"⬛🟩🟨🟨⬛\t5\t2.50\t\tbasic basil basin basis satin\n", | |
"⬛⬛🟨🟨🟩\t5\t1.00\t\tsiege singe\n", | |
"⬛🟩⬛🟩🟩\t5\t1.50\t\tlapse pause\n", | |
"🟨🟨⬛🟨🟩\t5\t4.00\t\tscare share snare spare stare\n", | |
"🟨⬛🟩🟩⬛\t5\t2.50\t\tbrisk crisp frisk prism\n", | |
"⬛🟨🟩⬛🟩\t5\t1.50\t\talike alive\n", | |
"🟨🟨🟩⬛⬛\t4\t1.67\t\tbriar friar triad trial\n", | |
"🟩🟨⬛⬛⬛\t4\t1.00\t\troyal rural\n", | |
"🟩🟩⬛⬛🟨\t4\t1.67\t\tracer ramen rarer raven\n", | |
"🟨⬛🟨🟨🟨\t4\t1.00\t\tmiser wiser\n", | |
"⬛⬛🟨🟨🟨\t4\t1.00\t\tislet sheik sinew stein\n", | |
"🟨🟩🟩⬛⬛\t4\t1.67\t\tdairy fairy hairy\n", | |
"🟨🟩⬛⬛🟩\t4\t1.67\t\tbarge carve farce large\n", | |
"🟨⬛🟨🟨⬛\t4\t1.00\t\tsprig strip\n", | |
"🟨🟨⬛🟨🟨\t4\t3.00\t\tshear smear spear swear\n", | |
"🟩⬛🟨⬛⬛\t4\t1.00\t\trobin\n", | |
"⬛🟨🟨⬛🟨\t3\t1.00\t\temail ideal media\n", | |
"🟨⬛🟨⬛🟩\t3\t1.00\t\tdirge eerie fibre\n", | |
"⬛🟩🟩⬛🟩\t3\t1.00\t\tnaive waive\n", | |
"🟩⬛🟨🟨🟨\t3\t1.00\t\tresin risen riser\n", | |
"⬛⬛🟩🟨🟨\t3\t1.00\t\tshied spied spiel\n", | |
"⬛⬛🟩🟩🟩\t3\t1.00\t\tnoise poise\n", | |
"🟨⬛🟩🟨🟩\t2\t1.00\t\tshire spire\n", | |
"🟨🟩⬛🟩⬛\t2\t1.00\t\tharsh marsh\n", | |
"🟨🟩⬛🟨⬛\t2\t1.00\t\tsatyr savor\n", | |
"🟨🟨⬛🟩🟩\t2\t1.00\t\tarose erase\n", | |
"🟨🟩⬛🟨🟨\t2\t1.00\t\tsafer saner\n", | |
"🟩⬛🟨⬛🟩\t2\t1.00\t\tridge rifle\n", | |
"⬛🟨🟨⬛🟩\t2\t1.00\t\timage inane\n", | |
"⬛🟩🟩🟩⬛\t2\t1.00\t\tdaisy waist\n", | |
"🟩⬛⬛🟩🟩\t2\t1.00\t\treuse rouse\n", | |
"⬛⬛🟩🟩🟨\t2\t1.00\t\texist heist\n", | |
"🟩⬛⬛🟨🟨\t2\t1.00\t\trebus reset\n", | |
"🟨🟩🟨⬛⬛\t2\t1.00\t\tnadir tapir\n", | |
"⬛🟨🟩🟩⬛\t1\t0.00\t\tamiss\n", | |
"⬛🟨🟨🟨🟩\t1\t0.00\t\taisle\n", | |
"🟩🟩⬛🟨⬛\t1\t0.00\t\traspy\n", | |
"🟨⬛🟩🟨🟨\t1\t0.00\t\tskier\n", | |
"🟨🟩⬛🟩🟩\t1\t0.00\t\tparse\n", | |
"🟨🟨🟩⬛🟩\t1\t0.00\t\tafire\n", | |
"⬛🟩⬛🟨🟨\t1\t0.00\t\teasel\n", | |
"🟩⬛🟨🟩🟩\t1\t0.00\t\trinse\n", | |
"🟩🟨⬛🟩⬛\t1\t0.00\t\troast\n", | |
"🟩⬛🟩⬛🟨\t1\t0.00\t\treign\n", | |
"⬛🟨🟨🟨🟨\t1\t0.00\t\tsepia\n", | |
"🟩⬛🟩⬛⬛\t1\t0.00\t\trhino\n", | |
"🟩🟩⬛⬛🟩\t1\t0.00\t\trange\n", | |
"🟨🟨🟨⬛🟩\t1\t0.00\t\tirate\n", | |
"🟨🟨🟨⬛🟨\t1\t0.00\t\taider\n", | |
"⬛🟨🟩🟨🟩\t1\t0.00\t\taside\n", | |
"🟩⬛🟨🟨⬛\t1\t0.00\t\trisky\n", | |
"🟨🟨🟩🟩🟩\t1\t0.00\t\tarise\n", | |
"⬛🟨🟨🟩⬛\t1\t0.00\t\tquasi\n", | |
"🟩🟩🟩⬛⬛\t1\t0.00\t\trainy\n", | |
"⬛🟩🟩🟨⬛\t1\t0.00\t\tsaint\n", | |
"⬛🟨🟩⬛🟨\t1\t0.00\t\talien\n", | |
"🟩⬛⬛🟨⬛\t1\t0.00\t\trusty\n", | |
"🟨⬛🟨🟩⬛\t1\t0.00\t\tfirst\n", | |
"🟨🟨🟨🟨⬛\t1\t0.00\t\tstair\n", | |
"🟩⬛⬛🟩⬛\t1\t0.00\t\troost\n", | |
"🟩🟨🟨⬛⬛\t1\t0.00\t\trival\n" | |
] | |
} | |
], | |
"source": [ | |
"print('first result\\tleft\\texpected\\tbest words')\n", | |
"for i in idxs:\n", | |
" print(strs[i])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment