Skip to content

Instantly share code, notes, and snippets.

@thejevans
Last active January 27, 2022 16:10
Show Gist options
  • Save thejevans/068f12e591df47239a849b7bee1d9552 to your computer and use it in GitHub Desktop.
Save thejevans/068f12e591df47239a849b7bee1d9552 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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