From 9172326013029ea0ccdccb1baca45fa915189b15 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Thu, 14 Mar 2024 16:47:11 -0700 Subject: [PATCH] upload wordle env, fix indexing issue in wordle env, attempt to improve reward (no improvement) --- .gitignore | 2 +- dqn_wordle.ipynb | 1546 +-- gym_wordle/__init__.py | 7 + gym_wordle/dictionary/guess_list.csv | 12972 ++++++++++++++++++++++ gym_wordle/dictionary/guess_list.npy | Bin 0 -> 519008 bytes gym_wordle/dictionary/solution_list.csv | 2315 ++++ gym_wordle/dictionary/solution_list.npy | Bin 0 -> 92728 bytes gym_wordle/utils.py | 93 + gym_wordle/wordle.py | 296 + 9 files changed, 16457 insertions(+), 774 deletions(-) create mode 100644 gym_wordle/__init__.py create mode 100644 gym_wordle/dictionary/guess_list.csv create mode 100644 gym_wordle/dictionary/guess_list.npy create mode 100644 gym_wordle/dictionary/solution_list.csv create mode 100644 gym_wordle/dictionary/solution_list.npy create mode 100644 gym_wordle/utils.py create mode 100644 gym_wordle/wordle.py diff --git a/.gitignore b/.gitignore index b3ea66f..6072b32 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ **/data/* **/*.zip -**/ \ No newline at end of file +**/__pycache__ \ No newline at end of file diff --git a/dqn_wordle.ipynb b/dqn_wordle.ipynb index 85faf54..9e79659 100644 --- a/dqn_wordle.ipynb +++ b/dqn_wordle.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -47,431 +47,473 @@ "---------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -124 |\n", + "| ep_rew_mean | -126 |\n", "| time/ | |\n", - "| fps | 784 |\n", + "| fps | 455 |\n", "| iterations | 1 |\n", - "| time_elapsed | 2 |\n", + "| time_elapsed | 4 |\n", "| total_timesteps | 2048 |\n", "---------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 2 |\n", + "| time_elapsed | 10 |\n", + "| total_timesteps | 4096 |\n", + "| train/ | |\n", + "| approx_kl | 0.006769434 |\n", + "| clip_fraction | 0.0309 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | 0.00119 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.87e+03 |\n", + "| n_updates | 10 |\n", + "| policy_gradient_loss | -0.0533 |\n", + "| value_loss | 5.21e+03 |\n", + "-----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -126 |\n", + "| time/ | |\n", + "| fps | 357 |\n", + "| iterations | 3 |\n", + "| time_elapsed | 17 |\n", + "| total_timesteps | 6144 |\n", + "| train/ | |\n", + "| approx_kl | 0.00641025 |\n", + "| clip_fraction | 0.0321 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.0916 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 2.06e+03 |\n", + "| n_updates | 20 |\n", + "| policy_gradient_loss | -0.0489 |\n", + "| value_loss | 4.36e+03 |\n", + "----------------------------------------\n", "------------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -121 |\n", "| time/ | |\n", - "| fps | 654 |\n", - "| iterations | 2 |\n", - "| time_elapsed | 6 |\n", - "| total_timesteps | 4096 |\n", + "| fps | 347 |\n", + "| iterations | 4 |\n", + "| time_elapsed | 23 |\n", + "| total_timesteps | 8192 |\n", "| train/ | |\n", - "| approx_kl | 0.0065368367 |\n", - "| clip_fraction | 0.027 |\n", + "| approx_kl | 0.0073487614 |\n", + "| clip_fraction | 0.0466 |\n", "| clip_range | 0.2 |\n", "| entropy_loss | -9.47 |\n", - "| explained_variance | 0.00416 |\n", + "| explained_variance | -0.0298 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 2.17e+03 |\n", - "| n_updates | 10 |\n", - "| policy_gradient_loss | -0.0517 |\n", - "| value_loss | 5.21e+03 |\n", + "| loss | 1.81e+03 |\n", + "| n_updates | 30 |\n", + "| policy_gradient_loss | -0.0539 |\n", + "| value_loss | 3.73e+03 |\n", "------------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 612 |\n", - "| iterations | 3 |\n", - "| time_elapsed | 10 |\n", - "| total_timesteps | 6144 |\n", - "| train/ | |\n", - "| approx_kl | 0.006391342 |\n", - "| clip_fraction | 0.0312 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.0923 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 1.97e+03 |\n", - "| n_updates | 20 |\n", - "| policy_gradient_loss | -0.0487 |\n", - "| value_loss | 4.27e+03 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -124 |\n", - "| time/ | |\n", - "| fps | 590 |\n", - "| iterations | 4 |\n", - "| time_elapsed | 13 |\n", - "| total_timesteps | 8192 |\n", - "| train/ | |\n", - "| approx_kl | 0.007267303 |\n", - "| clip_fraction | 0.0477 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.0297 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 1.41e+03 |\n", - "| n_updates | 30 |\n", - "| policy_gradient_loss | -0.0542 |\n", - "| value_loss | 3.64e+03 |\n", - "-----------------------------------------\n", - "------------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -124 |\n", - "| time/ | |\n", - "| fps | 579 |\n", - "| iterations | 5 |\n", - "| time_elapsed | 17 |\n", - "| total_timesteps | 10240 |\n", - "| train/ | |\n", - "| approx_kl | 0.0079803215 |\n", - "| clip_fraction | 0.0604 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.01 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 1.19e+03 |\n", - "| n_updates | 40 |\n", - "| policy_gradient_loss | -0.0581 |\n", - "| value_loss | 3.17e+03 |\n", - "------------------------------------------\n", - "------------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -120 |\n", - "| time/ | |\n", - "| fps | 572 |\n", - "| iterations | 6 |\n", - "| time_elapsed | 21 |\n", - "| total_timesteps | 12288 |\n", - "| train/ | |\n", - "| approx_kl | 0.0095686875 |\n", - "| clip_fraction | 0.0843 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.00451 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 1.07e+03 |\n", - "| n_updates | 50 |\n", - "| policy_gradient_loss | -0.0646 |\n", - "| value_loss | 2.68e+03 |\n", - "------------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", - "| time/ | |\n", - "| fps | 567 |\n", - "| iterations | 7 |\n", - "| time_elapsed | 25 |\n", - "| total_timesteps | 14336 |\n", - "| train/ | |\n", - "| approx_kl | 0.011415122 |\n", - "| clip_fraction | 0.114 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.00251 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 928 |\n", - "| n_updates | 60 |\n", - "| policy_gradient_loss | -0.0713 |\n", - "| value_loss | 2.17e+03 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 5.95 |\n", - "| ep_rew_mean | -120 |\n", - "| time/ | |\n", - "| fps | 563 |\n", - "| iterations | 8 |\n", - "| time_elapsed | 29 |\n", - "| total_timesteps | 16384 |\n", - "| train/ | |\n", - "| approx_kl | 0.012646846 |\n", - "| clip_fraction | 0.152 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.00144 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 989 |\n", - "| n_updates | 70 |\n", - "| policy_gradient_loss | -0.0767 |\n", - "| value_loss | 1.92e+03 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 560 |\n", - "| iterations | 9 |\n", - "| time_elapsed | 32 |\n", - "| total_timesteps | 18432 |\n", - "| train/ | |\n", - "| approx_kl | 0.015274222 |\n", - "| clip_fraction | 0.209 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.000909 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 838 |\n", - "| n_updates | 80 |\n", - "| policy_gradient_loss | -0.0848 |\n", - "| value_loss | 1.57e+03 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -122 |\n", - "| time/ | |\n", - "| fps | 558 |\n", - "| iterations | 10 |\n", - "| time_elapsed | 36 |\n", - "| total_timesteps | 20480 |\n", - "| train/ | |\n", - "| approx_kl | 0.017125849 |\n", - "| clip_fraction | 0.269 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.47 |\n", - "| explained_variance | -0.000586 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 634 |\n", - "| n_updates | 90 |\n", - "| policy_gradient_loss | -0.0913 |\n", - "| value_loss | 1.38e+03 |\n", - "-----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -121 |\n", "| time/ | |\n", - "| fps | 556 |\n", - "| iterations | 11 |\n", - "| time_elapsed | 40 |\n", - "| total_timesteps | 22528 |\n", + "| fps | 343 |\n", + "| iterations | 5 |\n", + "| time_elapsed | 29 |\n", + "| total_timesteps | 10240 |\n", "| train/ | |\n", - "| approx_kl | 0.02106983 |\n", - "| clip_fraction | 0.345 |\n", + "| approx_kl | 0.00845159 |\n", + "| clip_fraction | 0.068 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.46 |\n", - "| explained_variance | -0.000377 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.0105 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 538 |\n", - "| n_updates | 100 |\n", - "| policy_gradient_loss | -0.0985 |\n", - "| value_loss | 1.25e+03 |\n", + "| loss | 864 |\n", + "| n_updates | 40 |\n", + "| policy_gradient_loss | -0.0601 |\n", + "| value_loss | 2.99e+03 |\n", "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 341 |\n", + "| iterations | 6 |\n", + "| time_elapsed | 35 |\n", + "| total_timesteps | 12288 |\n", + "| train/ | |\n", + "| approx_kl | 0.009948943 |\n", + "| clip_fraction | 0.0943 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.00467 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.07e+03 |\n", + "| n_updates | 50 |\n", + "| policy_gradient_loss | -0.0664 |\n", + "| value_loss | 2.52e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 554 |\n", - "| iterations | 12 |\n", - "| time_elapsed | 44 |\n", - "| total_timesteps | 24576 |\n", + "| fps | 339 |\n", + "| iterations | 7 |\n", + "| time_elapsed | 42 |\n", + "| total_timesteps | 14336 |\n", "| train/ | |\n", - "| approx_kl | 0.031943925 |\n", - "| clip_fraction | 0.478 |\n", + "| approx_kl | 0.011411648 |\n", + "| clip_fraction | 0.121 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.46 |\n", - "| explained_variance | -0.000226 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.00249 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 487 |\n", - "| n_updates | 110 |\n", - "| policy_gradient_loss | -0.109 |\n", - "| value_loss | 1.15e+03 |\n", + "| loss | 903 |\n", + "| n_updates | 60 |\n", + "| policy_gradient_loss | -0.0719 |\n", + "| value_loss | 2.2e+03 |\n", "-----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -120 |\n", + "| ep_rew_mean | -123 |\n", "| time/ | |\n", - "| fps | 553 |\n", - "| iterations | 13 |\n", + "| fps | 338 |\n", + "| iterations | 8 |\n", "| time_elapsed | 48 |\n", - "| total_timesteps | 26624 |\n", + "| total_timesteps | 16384 |\n", "| train/ | |\n", - "| approx_kl | 0.05316051 |\n", - "| clip_fraction | 0.627 |\n", + "| approx_kl | 0.01300336 |\n", + "| clip_fraction | 0.159 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.46 |\n", - "| explained_variance | -8.43e-05 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.00149 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 521 |\n", - "| n_updates | 120 |\n", - "| policy_gradient_loss | -0.128 |\n", - "| value_loss | 1.12e+03 |\n", + "| loss | 839 |\n", + "| n_updates | 70 |\n", + "| policy_gradient_loss | -0.0779 |\n", + "| value_loss | 1.88e+03 |\n", "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", - "| ep_len_mean | 5.96 |\n", - "| ep_rew_mean | -122 |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", "| time/ | |\n", - "| fps | 551 |\n", - "| iterations | 14 |\n", - "| time_elapsed | 51 |\n", - "| total_timesteps | 28672 |\n", + "| fps | 336 |\n", + "| iterations | 9 |\n", + "| time_elapsed | 54 |\n", + "| total_timesteps | 18432 |\n", "| train/ | |\n", - "| approx_kl | 0.055725098 |\n", - "| clip_fraction | 0.711 |\n", + "| approx_kl | 0.015219824 |\n", + "| clip_fraction | 0.211 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.45 |\n", - "| explained_variance | -3.3e-05 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.000915 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 541 |\n", - "| n_updates | 130 |\n", - "| policy_gradient_loss | -0.138 |\n", - "| value_loss | 1.15e+03 |\n", + "| loss | 770 |\n", + "| n_updates | 80 |\n", + "| policy_gradient_loss | -0.0854 |\n", + "| value_loss | 1.61e+03 |\n", "-----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -127 |\n", + "| ep_rew_mean | -128 |\n", "| time/ | |\n", - "| fps | 550 |\n", - "| iterations | 15 |\n", - "| time_elapsed | 55 |\n", - "| total_timesteps | 30720 |\n", + "| fps | 335 |\n", + "| iterations | 10 |\n", + "| time_elapsed | 61 |\n", + "| total_timesteps | 20480 |\n", "| train/ | |\n", - "| approx_kl | 0.057101354 |\n", - "| clip_fraction | 0.73 |\n", + "| approx_kl | 0.017209966 |\n", + "| clip_fraction | 0.27 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.47 |\n", + "| explained_variance | -0.000583 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 689 |\n", + "| n_updates | 90 |\n", + "| policy_gradient_loss | -0.0912 |\n", + "| value_loss | 1.43e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -126 |\n", + "| time/ | |\n", + "| fps | 335 |\n", + "| iterations | 11 |\n", + "| time_elapsed | 67 |\n", + "| total_timesteps | 22528 |\n", + "| train/ | |\n", + "| approx_kl | 0.020546965 |\n", + "| clip_fraction | 0.348 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.46 |\n", + "| explained_variance | -0.000374 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 605 |\n", + "| n_updates | 100 |\n", + "| policy_gradient_loss | -0.0989 |\n", + "| value_loss | 1.27e+03 |\n", + "-----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -126 |\n", + "| time/ | |\n", + "| fps | 334 |\n", + "| iterations | 12 |\n", + "| time_elapsed | 73 |\n", + "| total_timesteps | 24576 |\n", + "| train/ | |\n", + "| approx_kl | 0.03119991 |\n", + "| clip_fraction | 0.478 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.46 |\n", + "| explained_variance | -0.000229 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 510 |\n", + "| n_updates | 110 |\n", + "| policy_gradient_loss | -0.109 |\n", + "| value_loss | 1.17e+03 |\n", + "----------------------------------------\n", + "---------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 334 |\n", + "| iterations | 13 |\n", + "| time_elapsed | 79 |\n", + "| total_timesteps | 26624 |\n", + "| train/ | |\n", + "| approx_kl | 0.0502273 |\n", + "| clip_fraction | 0.605 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.46 |\n", + "| explained_variance | -0.000101 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 582 |\n", + "| n_updates | 120 |\n", + "| policy_gradient_loss | -0.127 |\n", + "| value_loss | 1.13e+03 |\n", + "---------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -121 |\n", + "| time/ | |\n", + "| fps | 334 |\n", + "| iterations | 14 |\n", + "| time_elapsed | 85 |\n", + "| total_timesteps | 28672 |\n", + "| train/ | |\n", + "| approx_kl | 0.060225103 |\n", + "| clip_fraction | 0.736 |\n", "| clip_range | 0.2 |\n", "| entropy_loss | -9.45 |\n", - "| explained_variance | -1.74e-05 |\n", + "| explained_variance | -3.97e-05 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 598 |\n", + "| loss | 530 |\n", + "| n_updates | 130 |\n", + "| policy_gradient_loss | -0.142 |\n", + "| value_loss | 1.13e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 332 |\n", + "| iterations | 15 |\n", + "| time_elapsed | 92 |\n", + "| total_timesteps | 30720 |\n", + "| train/ | |\n", + "| approx_kl | 0.057931915 |\n", + "| clip_fraction | 0.743 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.45 |\n", + "| explained_variance | -2e-05 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 571 |\n", "| n_updates | 140 |\n", - "| policy_gradient_loss | -0.141 |\n", - "| value_loss | 1.15e+03 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.14e+03 |\n", "-----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 549 |\n", + "| fps | 329 |\n", "| iterations | 16 |\n", - "| time_elapsed | 59 |\n", + "| time_elapsed | 99 |\n", "| total_timesteps | 32768 |\n", "| train/ | |\n", - "| approx_kl | 0.06564396 |\n", - "| clip_fraction | 0.73 |\n", + "| approx_kl | 0.06145256 |\n", + "| clip_fraction | 0.737 |\n", "| clip_range | 0.2 |\n", "| entropy_loss | -9.44 |\n", - "| explained_variance | -1.05e-05 |\n", + "| explained_variance | -1.12e-05 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 506 |\n", + "| loss | 612 |\n", "| n_updates | 150 |\n", - "| policy_gradient_loss | -0.141 |\n", - "| value_loss | 1.17e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -124 |\n", - "| time/ | |\n", - "| fps | 549 |\n", - "| iterations | 17 |\n", - "| time_elapsed | 63 |\n", - "| total_timesteps | 34816 |\n", - "| train/ | |\n", - "| approx_kl | 0.05891238 |\n", - "| clip_fraction | 0.735 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.43 |\n", - "| explained_variance | -7.15e-06 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 564 |\n", - "| n_updates | 160 |\n", - "| policy_gradient_loss | -0.141 |\n", - "| value_loss | 1.15e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -126 |\n", - "| time/ | |\n", - "| fps | 548 |\n", - "| iterations | 18 |\n", - "| time_elapsed | 67 |\n", - "| total_timesteps | 36864 |\n", - "| train/ | |\n", - "| approx_kl | 0.06345081 |\n", - "| clip_fraction | 0.753 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.43 |\n", - "| explained_variance | -5.13e-06 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 625 |\n", - "| n_updates | 170 |\n", "| policy_gradient_loss | -0.143 |\n", "| value_loss | 1.14e+03 |\n", "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -125 |\n", + "| ep_rew_mean | -120 |\n", "| time/ | |\n", - "| fps | 547 |\n", - "| iterations | 19 |\n", - "| time_elapsed | 71 |\n", - "| total_timesteps | 38912 |\n", + "| fps | 328 |\n", + "| iterations | 17 |\n", + "| time_elapsed | 106 |\n", + "| total_timesteps | 34816 |\n", "| train/ | |\n", - "| approx_kl | 0.061060853 |\n", - "| clip_fraction | 0.71 |\n", + "| approx_kl | 0.062183782 |\n", + "| clip_fraction | 0.731 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.42 |\n", - "| explained_variance | -3.7e-06 |\n", + "| entropy_loss | -9.43 |\n", + "| explained_variance | -7.63e-06 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 715 |\n", - "| n_updates | 180 |\n", - "| policy_gradient_loss | -0.139 |\n", - "| value_loss | 1.15e+03 |\n", + "| loss | 560 |\n", + "| n_updates | 160 |\n", + "| policy_gradient_loss | -0.142 |\n", + "| value_loss | 1.14e+03 |\n", "-----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -121 |\n", + "| time/ | |\n", + "| fps | 326 |\n", + "| iterations | 18 |\n", + "| time_elapsed | 112 |\n", + "| total_timesteps | 36864 |\n", + "| train/ | |\n", + "| approx_kl | 0.06656339 |\n", + "| clip_fraction | 0.748 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.43 |\n", + "| explained_variance | -5.48e-06 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 605 |\n", + "| n_updates | 170 |\n", + "| policy_gradient_loss | -0.145 |\n", + "| value_loss | 1.12e+03 |\n", + "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 326 |\n", + "| iterations | 19 |\n", + "| time_elapsed | 119 |\n", + "| total_timesteps | 38912 |\n", + "| train/ | |\n", + "| approx_kl | 0.07115179 |\n", + "| clip_fraction | 0.767 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.42 |\n", + "| explained_variance | -3.93e-06 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 561 |\n", + "| n_updates | 180 |\n", + "| policy_gradient_loss | -0.146 |\n", + "| value_loss | 1.13e+03 |\n", + "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 326 |\n", + "| iterations | 20 |\n", + "| time_elapsed | 125 |\n", + "| total_timesteps | 40960 |\n", + "| train/ | |\n", + "| approx_kl | 0.07023676 |\n", + "| clip_fraction | 0.74 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.41 |\n", + "| explained_variance | -2.86e-06 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 590 |\n", + "| n_updates | 190 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.17e+03 |\n", + "----------------------------------------\n", "---------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -126 |\n", + "| ep_rew_mean | -124 |\n", "| time/ | |\n", - "| fps | 548 |\n", - "| iterations | 20 |\n", - "| time_elapsed | 74 |\n", - "| total_timesteps | 40960 |\n", + "| fps | 326 |\n", + "| iterations | 21 |\n", + "| time_elapsed | 131 |\n", + "| total_timesteps | 43008 |\n", "| train/ | |\n", - "| approx_kl | 0.0626598 |\n", - "| clip_fraction | 0.721 |\n", + "| approx_kl | 0.0665413 |\n", + "| clip_fraction | 0.746 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.42 |\n", - "| explained_variance | -2.86e-06 |\n", + "| entropy_loss | -9.4 |\n", + "| explained_variance | -2.15e-06 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 665 |\n", - "| n_updates | 190 |\n", - "| policy_gradient_loss | -0.141 |\n", - "| value_loss | 1.17e+03 |\n", + "| loss | 550 |\n", + "| n_updates | 200 |\n", + "| policy_gradient_loss | -0.145 |\n", + "| value_loss | 1.16e+03 |\n", "---------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 325 |\n", + "| iterations | 22 |\n", + "| time_elapsed | 138 |\n", + "| total_timesteps | 45056 |\n", + "| train/ | |\n", + "| approx_kl | 0.08091866 |\n", + "| clip_fraction | 0.745 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.38 |\n", + "| explained_variance | -1.91e-06 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 594 |\n", + "| n_updates | 210 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.15e+03 |\n", + "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -122 |\n", + "| ep_rew_mean | -125 |\n", "| time/ | |\n", - "| fps | 547 |\n", - "| iterations | 21 |\n", - "| time_elapsed | 78 |\n", - "| total_timesteps | 43008 |\n", + "| fps | 325 |\n", + "| iterations | 23 |\n", + "| time_elapsed | 144 |\n", + "| total_timesteps | 47104 |\n", "| train/ | |\n", - "| approx_kl | 0.066325136 |\n", - "| clip_fraction | 0.743 |\n", + "| approx_kl | 0.070498824 |\n", + "| clip_fraction | 0.734 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.41 |\n", - "| explained_variance | -2.15e-06 |\n", + "| entropy_loss | -9.36 |\n", + "| explained_variance | -1.19e-06 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 670 |\n", - "| n_updates | 200 |\n", - "| policy_gradient_loss | -0.143 |\n", + "| loss | 573 |\n", + "| n_updates | 220 |\n", + "| policy_gradient_loss | -0.144 |\n", "| value_loss | 1.18e+03 |\n", "-----------------------------------------\n", "----------------------------------------\n", @@ -479,482 +521,419 @@ "| ep_len_mean | 6 |\n", "| ep_rew_mean | -123 |\n", "| time/ | |\n", - "| fps | 544 |\n", - "| iterations | 22 |\n", - "| time_elapsed | 82 |\n", - "| total_timesteps | 45056 |\n", + "| fps | 325 |\n", + "| iterations | 24 |\n", + "| time_elapsed | 151 |\n", + "| total_timesteps | 49152 |\n", "| train/ | |\n", - "| approx_kl | 0.06377452 |\n", - "| clip_fraction | 0.721 |\n", + "| approx_kl | 0.06726791 |\n", + "| clip_fraction | 0.728 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.4 |\n", - "| explained_variance | -1.91e-06 |\n", + "| entropy_loss | -9.34 |\n", + "| explained_variance | -1.07e-06 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 695 |\n", - "| n_updates | 210 |\n", - "| policy_gradient_loss | -0.142 |\n", - "| value_loss | 1.15e+03 |\n", + "| loss | 564 |\n", + "| n_updates | 230 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.18e+03 |\n", "----------------------------------------\n", "---------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -122 |\n", + "| ep_rew_mean | -126 |\n", "| time/ | |\n", - "| fps | 543 |\n", - "| iterations | 23 |\n", - "| time_elapsed | 86 |\n", - "| total_timesteps | 47104 |\n", + "| fps | 324 |\n", + "| iterations | 25 |\n", + "| time_elapsed | 157 |\n", + "| total_timesteps | 51200 |\n", "| train/ | |\n", - "| approx_kl | 0.0712228 |\n", - "| clip_fraction | 0.734 |\n", + "| approx_kl | 0.0721001 |\n", + "| clip_fraction | 0.727 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.39 |\n", - "| explained_variance | -1.43e-06 |\n", + "| entropy_loss | -9.31 |\n", + "| explained_variance | -8.34e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 691 |\n", - "| n_updates | 220 |\n", + "| loss | 579 |\n", + "| n_updates | 240 |\n", "| policy_gradient_loss | -0.143 |\n", - "| value_loss | 1.15e+03 |\n", + "| value_loss | 1.14e+03 |\n", "---------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -124 |\n", "| time/ | |\n", - "| fps | 542 |\n", - "| iterations | 24 |\n", - "| time_elapsed | 90 |\n", - "| total_timesteps | 49152 |\n", - "| train/ | |\n", - "| approx_kl | 0.06300552 |\n", - "| clip_fraction | 0.737 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.38 |\n", - "| explained_variance | -1.19e-06 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 475 |\n", - "| n_updates | 230 |\n", - "| policy_gradient_loss | -0.144 |\n", - "| value_loss | 1.17e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -126 |\n", - "| time/ | |\n", - "| fps | 540 |\n", - "| iterations | 25 |\n", - "| time_elapsed | 94 |\n", - "| total_timesteps | 51200 |\n", - "| train/ | |\n", - "| approx_kl | 0.07357139 |\n", - "| clip_fraction | 0.738 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.37 |\n", - "| explained_variance | -1.07e-06 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 687 |\n", - "| n_updates | 240 |\n", - "| policy_gradient_loss | -0.143 |\n", - "| value_loss | 1.18e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -124 |\n", - "| time/ | |\n", - "| fps | 539 |\n", + "| fps | 324 |\n", "| iterations | 26 |\n", - "| time_elapsed | 98 |\n", + "| time_elapsed | 164 |\n", "| total_timesteps | 53248 |\n", "| train/ | |\n", - "| approx_kl | 0.07966857 |\n", - "| clip_fraction | 0.756 |\n", + "| approx_kl | 0.08537817 |\n", + "| clip_fraction | 0.767 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.34 |\n", + "| entropy_loss | -9.27 |\n", "| explained_variance | -8.34e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 408 |\n", + "| loss | 648 |\n", "| n_updates | 250 |\n", - "| policy_gradient_loss | -0.144 |\n", - "| value_loss | 1.17e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", - "| time/ | |\n", - "| fps | 539 |\n", - "| iterations | 27 |\n", - "| time_elapsed | 102 |\n", - "| total_timesteps | 55296 |\n", - "| train/ | |\n", - "| approx_kl | 0.07282317 |\n", - "| clip_fraction | 0.743 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -9.31 |\n", - "| explained_variance | -5.96e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 471 |\n", - "| n_updates | 260 |\n", "| policy_gradient_loss | -0.145 |\n", "| value_loss | 1.16e+03 |\n", "----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", + "| ep_rew_mean | -123 |\n", "| time/ | |\n", - "| fps | 539 |\n", - "| iterations | 28 |\n", - "| time_elapsed | 106 |\n", - "| total_timesteps | 57344 |\n", + "| fps | 324 |\n", + "| iterations | 27 |\n", + "| time_elapsed | 170 |\n", + "| total_timesteps | 55296 |\n", "| train/ | |\n", - "| approx_kl | 0.07441577 |\n", - "| clip_fraction | 0.731 |\n", + "| approx_kl | 0.07838201 |\n", + "| clip_fraction | 0.757 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.28 |\n", + "| entropy_loss | -9.21 |\n", "| explained_variance | -5.96e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 501 |\n", + "| loss | 580 |\n", + "| n_updates | 260 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.14e+03 |\n", + "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 28 |\n", + "| time_elapsed | 176 |\n", + "| total_timesteps | 57344 |\n", + "| train/ | |\n", + "| approx_kl | 0.08116107 |\n", + "| clip_fraction | 0.748 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -9.09 |\n", + "| explained_variance | -4.77e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 602 |\n", "| n_updates | 270 |\n", - "| policy_gradient_loss | -0.143 |\n", + "| policy_gradient_loss | -0.144 |\n", + "| value_loss | 1.15e+03 |\n", + "----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -118 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 29 |\n", + "| time_elapsed | 183 |\n", + "| total_timesteps | 59392 |\n", + "| train/ | |\n", + "| approx_kl | 0.085108414 |\n", + "| clip_fraction | 0.741 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.87 |\n", + "| explained_variance | -4.77e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 562 |\n", + "| n_updates | 280 |\n", + "| policy_gradient_loss | -0.142 |\n", + "| value_loss | 1.18e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 323 |\n", + "| iterations | 30 |\n", + "| time_elapsed | 189 |\n", + "| total_timesteps | 61440 |\n", + "| train/ | |\n", + "| approx_kl | 0.066152625 |\n", + "| clip_fraction | 0.722 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.75 |\n", + "| explained_variance | -4.77e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 568 |\n", + "| n_updates | 290 |\n", + "| policy_gradient_loss | -0.138 |\n", + "| value_loss | 1.14e+03 |\n", + "-----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -120 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 31 |\n", + "| time_elapsed | 195 |\n", + "| total_timesteps | 63488 |\n", + "| train/ | |\n", + "| approx_kl | 0.06854295 |\n", + "| clip_fraction | 0.7 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.73 |\n", + "| explained_variance | -4.77e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 577 |\n", + "| n_updates | 300 |\n", + "| policy_gradient_loss | -0.139 |\n", + "| value_loss | 1.14e+03 |\n", + "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 32 |\n", + "| time_elapsed | 201 |\n", + "| total_timesteps | 65536 |\n", + "| train/ | |\n", + "| approx_kl | 0.07200403 |\n", + "| clip_fraction | 0.702 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.65 |\n", + "| explained_variance | -4.77e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 570 |\n", + "| n_updates | 310 |\n", + "| policy_gradient_loss | -0.134 |\n", + "| value_loss | 1.15e+03 |\n", + "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -123 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 33 |\n", + "| time_elapsed | 208 |\n", + "| total_timesteps | 67584 |\n", + "| train/ | |\n", + "| approx_kl | 0.07691643 |\n", + "| clip_fraction | 0.692 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.64 |\n", + "| explained_variance | -2.38e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 618 |\n", + "| n_updates | 320 |\n", + "| policy_gradient_loss | -0.137 |\n", "| value_loss | 1.16e+03 |\n", "----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", - "| ep_len_mean | 5.97 |\n", - "| ep_rew_mean | -125 |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 539 |\n", - "| iterations | 29 |\n", - "| time_elapsed | 110 |\n", - "| total_timesteps | 59392 |\n", + "| fps | 325 |\n", + "| iterations | 34 |\n", + "| time_elapsed | 214 |\n", + "| total_timesteps | 69632 |\n", "| train/ | |\n", - "| approx_kl | 0.07315491 |\n", - "| clip_fraction | 0.757 |\n", + "| approx_kl | 0.07179158 |\n", + "| clip_fraction | 0.69 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.23 |\n", - "| explained_variance | -4.77e-07 |\n", + "| entropy_loss | -8.56 |\n", + "| explained_variance | -2.38e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 569 |\n", - "| n_updates | 280 |\n", - "| policy_gradient_loss | -0.146 |\n", - "| value_loss | 1.13e+03 |\n", + "| loss | 684 |\n", + "| n_updates | 330 |\n", + "| policy_gradient_loss | -0.139 |\n", + "| value_loss | 1.15e+03 |\n", "----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -120 |\n", "| time/ | |\n", - "| fps | 538 |\n", - "| iterations | 30 |\n", - "| time_elapsed | 114 |\n", - "| total_timesteps | 61440 |\n", + "| fps | 325 |\n", + "| iterations | 35 |\n", + "| time_elapsed | 220 |\n", + "| total_timesteps | 71680 |\n", "| train/ | |\n", - "| approx_kl | 0.06323205 |\n", - "| clip_fraction | 0.716 |\n", + "| approx_kl | 0.06354737 |\n", + "| clip_fraction | 0.676 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.18 |\n", - "| explained_variance | -3.58e-07 |\n", + "| entropy_loss | -8.45 |\n", + "| explained_variance | -2.38e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 612 |\n", - "| n_updates | 290 |\n", - "| policy_gradient_loss | -0.143 |\n", + "| loss | 573 |\n", + "| n_updates | 340 |\n", + "| policy_gradient_loss | -0.137 |\n", "| value_loss | 1.17e+03 |\n", "----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -122 |\n", + "| time/ | |\n", + "| fps | 325 |\n", + "| iterations | 36 |\n", + "| time_elapsed | 226 |\n", + "| total_timesteps | 73728 |\n", + "| train/ | |\n", + "| approx_kl | 0.061548397 |\n", + "| clip_fraction | 0.658 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.38 |\n", + "| explained_variance | -1.19e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 572 |\n", + "| n_updates | 350 |\n", + "| policy_gradient_loss | -0.134 |\n", + "| value_loss | 1.12e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -122 |\n", + "| time/ | |\n", + "| fps | 325 |\n", + "| iterations | 37 |\n", + "| time_elapsed | 232 |\n", + "| total_timesteps | 75776 |\n", + "| train/ | |\n", + "| approx_kl | 0.059452366 |\n", + "| clip_fraction | 0.651 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -8.33 |\n", + "| explained_variance | -2.38e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 551 |\n", + "| n_updates | 360 |\n", + "| policy_gradient_loss | -0.133 |\n", + "| value_loss | 1.16e+03 |\n", + "-----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", + "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 538 |\n", - "| iterations | 31 |\n", - "| time_elapsed | 117 |\n", - "| total_timesteps | 63488 |\n", + "| fps | 325 |\n", + "| iterations | 38 |\n", + "| time_elapsed | 239 |\n", + "| total_timesteps | 77824 |\n", "| train/ | |\n", - "| approx_kl | 0.07022999 |\n", - "| clip_fraction | 0.735 |\n", + "| approx_kl | 0.06572275 |\n", + "| clip_fraction | 0.667 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.11 |\n", - "| explained_variance | -4.77e-07 |\n", + "| entropy_loss | -8.17 |\n", + "| explained_variance | -1.19e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 653 |\n", - "| n_updates | 300 |\n", - "| policy_gradient_loss | -0.143 |\n", - "| value_loss | 1.14e+03 |\n", + "| loss | 554 |\n", + "| n_updates | 370 |\n", + "| policy_gradient_loss | -0.132 |\n", + "| value_loss | 1.15e+03 |\n", "----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", + "| ep_rew_mean | -125 |\n", "| time/ | |\n", - "| fps | 537 |\n", - "| iterations | 32 |\n", - "| time_elapsed | 121 |\n", - "| total_timesteps | 65536 |\n", + "| fps | 324 |\n", + "| iterations | 39 |\n", + "| time_elapsed | 245 |\n", + "| total_timesteps | 79872 |\n", "| train/ | |\n", - "| approx_kl | 0.07809374 |\n", - "| clip_fraction | 0.734 |\n", + "| approx_kl | 0.05422177 |\n", + "| clip_fraction | 0.637 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -9.02 |\n", - "| explained_variance | -4.77e-07 |\n", + "| entropy_loss | -7.93 |\n", + "| explained_variance | -1.19e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 505 |\n", - "| n_updates | 310 |\n", - "| policy_gradient_loss | -0.14 |\n", - "| value_loss | 1.14e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", - "| time/ | |\n", - "| fps | 537 |\n", - "| iterations | 33 |\n", - "| time_elapsed | 125 |\n", - "| total_timesteps | 67584 |\n", - "| train/ | |\n", - "| approx_kl | 0.07546057 |\n", - "| clip_fraction | 0.731 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.93 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 549 |\n", - "| n_updates | 320 |\n", - "| policy_gradient_loss | -0.139 |\n", - "| value_loss | 1.14e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 536 |\n", - "| iterations | 34 |\n", - "| time_elapsed | 129 |\n", - "| total_timesteps | 69632 |\n", - "| train/ | |\n", - "| approx_kl | 0.06426198 |\n", - "| clip_fraction | 0.71 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.85 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 546 |\n", - "| n_updates | 330 |\n", - "| policy_gradient_loss | -0.139 |\n", + "| loss | 600 |\n", + "| n_updates | 380 |\n", + "| policy_gradient_loss | -0.127 |\n", "| value_loss | 1.16e+03 |\n", "----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -122 |\n", + "| time/ | |\n", + "| fps | 324 |\n", + "| iterations | 40 |\n", + "| time_elapsed | 252 |\n", + "| total_timesteps | 81920 |\n", + "| train/ | |\n", + "| approx_kl | 0.05258019 |\n", + "| clip_fraction | 0.591 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -7.8 |\n", + "| explained_variance | -1.19e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 682 |\n", + "| n_updates | 390 |\n", + "| policy_gradient_loss | -0.123 |\n", + "| value_loss | 1.15e+03 |\n", + "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -123 |\n", "| time/ | |\n", - "| fps | 537 |\n", - "| iterations | 35 |\n", - "| time_elapsed | 133 |\n", - "| total_timesteps | 71680 |\n", + "| fps | 324 |\n", + "| iterations | 41 |\n", + "| time_elapsed | 258 |\n", + "| total_timesteps | 83968 |\n", "| train/ | |\n", - "| approx_kl | 0.067716464 |\n", - "| clip_fraction | 0.693 |\n", + "| approx_kl | 0.053135283 |\n", + "| clip_fraction | 0.574 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -8.76 |\n", - "| explained_variance | -2.38e-07 |\n", + "| entropy_loss | -7.49 |\n", + "| explained_variance | 0 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 577 |\n", - "| n_updates | 340 |\n", - "| policy_gradient_loss | -0.138 |\n", + "| loss | 560 |\n", + "| n_updates | 400 |\n", + "| policy_gradient_loss | -0.118 |\n", "| value_loss | 1.16e+03 |\n", "-----------------------------------------\n", "----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -120 |\n", + "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 536 |\n", - "| iterations | 36 |\n", - "| time_elapsed | 137 |\n", - "| total_timesteps | 73728 |\n", + "| fps | 324 |\n", + "| iterations | 42 |\n", + "| time_elapsed | 265 |\n", + "| total_timesteps | 86016 |\n", "| train/ | |\n", - "| approx_kl | 0.07348621 |\n", - "| clip_fraction | 0.719 |\n", + "| approx_kl | 0.04523302 |\n", + "| clip_fraction | 0.543 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -8.72 |\n", + "| entropy_loss | -7.3 |\n", "| explained_variance | -2.38e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 594 |\n", - "| n_updates | 350 |\n", - "| policy_gradient_loss | -0.138 |\n", - "| value_loss | 1.15e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -125 |\n", - "| time/ | |\n", - "| fps | 536 |\n", - "| iterations | 37 |\n", - "| time_elapsed | 141 |\n", - "| total_timesteps | 75776 |\n", - "| train/ | |\n", - "| approx_kl | 0.06314379 |\n", - "| clip_fraction | 0.663 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.69 |\n", - "| explained_variance | -3.58e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 546 |\n", - "| n_updates | 360 |\n", - "| policy_gradient_loss | -0.135 |\n", - "| value_loss | 1.15e+03 |\n", - "----------------------------------------\n", - "---------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 535 |\n", - "| iterations | 38 |\n", - "| time_elapsed | 145 |\n", - "| total_timesteps | 77824 |\n", - "| train/ | |\n", - "| approx_kl | 0.0605906 |\n", - "| clip_fraction | 0.678 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.58 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 569 |\n", - "| n_updates | 370 |\n", - "| policy_gradient_loss | -0.137 |\n", - "| value_loss | 1.15e+03 |\n", - "---------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", - "| time/ | |\n", - "| fps | 535 |\n", - "| iterations | 39 |\n", - "| time_elapsed | 149 |\n", - "| total_timesteps | 79872 |\n", - "| train/ | |\n", - "| approx_kl | 0.06449682 |\n", - "| clip_fraction | 0.682 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.48 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 602 |\n", - "| n_updates | 380 |\n", - "| policy_gradient_loss | -0.134 |\n", - "| value_loss | 1.14e+03 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 535 |\n", - "| iterations | 40 |\n", - "| time_elapsed | 153 |\n", - "| total_timesteps | 81920 |\n", - "| train/ | |\n", - "| approx_kl | 0.05844091 |\n", - "| clip_fraction | 0.633 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.33 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 575 |\n", - "| n_updates | 390 |\n", - "| policy_gradient_loss | -0.13 |\n", + "| loss | 472 |\n", + "| n_updates | 410 |\n", + "| policy_gradient_loss | -0.105 |\n", "| value_loss | 1.16e+03 |\n", "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -120 |\n", - "| time/ | |\n", - "| fps | 535 |\n", - "| iterations | 41 |\n", - "| time_elapsed | 156 |\n", - "| total_timesteps | 83968 |\n", - "| train/ | |\n", - "| approx_kl | 0.049975857 |\n", - "| clip_fraction | 0.601 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -8.15 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 581 |\n", - "| n_updates | 400 |\n", - "| policy_gradient_loss | -0.127 |\n", - "| value_loss | 1.15e+03 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -122 |\n", - "| time/ | |\n", - "| fps | 534 |\n", - "| iterations | 42 |\n", - "| time_elapsed | 160 |\n", - "| total_timesteps | 86016 |\n", - "| train/ | |\n", - "| approx_kl | 0.055807307 |\n", - "| clip_fraction | 0.616 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -7.91 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 590 |\n", - "| n_updates | 410 |\n", - "| policy_gradient_loss | -0.123 |\n", - "| value_loss | 1.14e+03 |\n", - "-----------------------------------------\n", - "----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -123 |\n", - "| time/ | |\n", - "| fps | 534 |\n", - "| iterations | 43 |\n", - "| time_elapsed | 164 |\n", - "| total_timesteps | 88064 |\n", - "| train/ | |\n", - "| approx_kl | 0.05585126 |\n", - "| clip_fraction | 0.592 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -7.69 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 512 |\n", - "| n_updates | 420 |\n", - "| policy_gradient_loss | -0.117 |\n", - "| value_loss | 1.17e+03 |\n", - "----------------------------------------\n", - "-----------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", "| ep_rew_mean | -121 |\n", "| time/ | |\n", - "| fps | 534 |\n", - "| iterations | 44 |\n", - "| time_elapsed | 168 |\n", - "| total_timesteps | 90112 |\n", + "| fps | 324 |\n", + "| iterations | 43 |\n", + "| time_elapsed | 271 |\n", + "| total_timesteps | 88064 |\n", "| train/ | |\n", - "| approx_kl | 0.050130654 |\n", - "| clip_fraction | 0.546 |\n", + "| approx_kl | 0.044511747 |\n", + "| clip_fraction | 0.487 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -7.48 |\n", - "| explained_variance | 0 |\n", + "| entropy_loss | -7.08 |\n", + "| explained_variance | -2.38e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 608 |\n", - "| n_updates | 430 |\n", - "| policy_gradient_loss | -0.106 |\n", + "| loss | 510 |\n", + "| n_updates | 420 |\n", + "| policy_gradient_loss | -0.101 |\n", "| value_loss | 1.15e+03 |\n", "-----------------------------------------\n", "-----------------------------------------\n", @@ -962,115 +941,136 @@ "| ep_len_mean | 6 |\n", "| ep_rew_mean | -122 |\n", "| time/ | |\n", - "| fps | 534 |\n", + "| fps | 324 |\n", + "| iterations | 44 |\n", + "| time_elapsed | 277 |\n", + "| total_timesteps | 90112 |\n", + "| train/ | |\n", + "| approx_kl | 0.048598923 |\n", + "| clip_fraction | 0.489 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -6.8 |\n", + "| explained_variance | -1.19e-07 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 499 |\n", + "| n_updates | 430 |\n", + "| policy_gradient_loss | -0.096 |\n", + "| value_loss | 1.15e+03 |\n", + "-----------------------------------------\n", + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -124 |\n", + "| time/ | |\n", + "| fps | 324 |\n", "| iterations | 45 |\n", - "| time_elapsed | 172 |\n", + "| time_elapsed | 284 |\n", "| total_timesteps | 92160 |\n", "| train/ | |\n", - "| approx_kl | 0.050139036 |\n", - "| clip_fraction | 0.547 |\n", + "| approx_kl | 0.043928873 |\n", + "| clip_fraction | 0.514 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -7.23 |\n", - "| explained_variance | 0 |\n", + "| entropy_loss | -6.63 |\n", + "| explained_variance | -2.38e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 628 |\n", + "| loss | 559 |\n", "| n_updates | 440 |\n", - "| policy_gradient_loss | -0.103 |\n", - "| value_loss | 1.14e+03 |\n", + "| policy_gradient_loss | -0.0893 |\n", + "| value_loss | 1.13e+03 |\n", "-----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -126 |\n", "| time/ | |\n", - "| fps | 533 |\n", + "| fps | 323 |\n", "| iterations | 46 |\n", - "| time_elapsed | 176 |\n", + "| time_elapsed | 290 |\n", "| total_timesteps | 94208 |\n", "| train/ | |\n", - "| approx_kl | 0.045009457 |\n", + "| approx_kl | 0.053060684 |\n", "| clip_fraction | 0.495 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -7.04 |\n", - "| explained_variance | -2.38e-07 |\n", + "| entropy_loss | -6.49 |\n", + "| explained_variance | 0 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 557 |\n", + "| loss | 644 |\n", "| n_updates | 450 |\n", - "| policy_gradient_loss | -0.0923 |\n", - "| value_loss | 1.13e+03 |\n", + "| policy_gradient_loss | -0.0849 |\n", + "| value_loss | 1.16e+03 |\n", "-----------------------------------------\n", - "---------------------------------------\n", - "| rollout/ | |\n", - "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", - "| time/ | |\n", - "| fps | 533 |\n", - "| iterations | 47 |\n", - "| time_elapsed | 180 |\n", - "| total_timesteps | 96256 |\n", - "| train/ | |\n", - "| approx_kl | 0.0487647 |\n", - "| clip_fraction | 0.499 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -6.85 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0003 |\n", - "| loss | 531 |\n", - "| n_updates | 460 |\n", - "| policy_gradient_loss | -0.0868 |\n", - "| value_loss | 1.17e+03 |\n", - "---------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", "| ep_rew_mean | -123 |\n", "| time/ | |\n", - "| fps | 533 |\n", - "| iterations | 48 |\n", - "| time_elapsed | 184 |\n", - "| total_timesteps | 98304 |\n", + "| fps | 323 |\n", + "| iterations | 47 |\n", + "| time_elapsed | 297 |\n", + "| total_timesteps | 96256 |\n", "| train/ | |\n", - "| approx_kl | 0.052709702 |\n", - "| clip_fraction | 0.507 |\n", + "| approx_kl | 0.056993663 |\n", + "| clip_fraction | 0.587 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -6.58 |\n", - "| explained_variance | -1.19e-07 |\n", + "| entropy_loss | -6.33 |\n", + "| explained_variance | 0 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 547 |\n", - "| n_updates | 470 |\n", - "| policy_gradient_loss | -0.0865 |\n", - "| value_loss | 1.14e+03 |\n", + "| loss | 608 |\n", + "| n_updates | 460 |\n", + "| policy_gradient_loss | -0.0832 |\n", + "| value_loss | 1.17e+03 |\n", "-----------------------------------------\n", + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6 |\n", + "| ep_rew_mean | -126 |\n", + "| time/ | |\n", + "| fps | 323 |\n", + "| iterations | 48 |\n", + "| time_elapsed | 303 |\n", + "| total_timesteps | 98304 |\n", + "| train/ | |\n", + "| approx_kl | 0.05388363 |\n", + "| clip_fraction | 0.536 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -6.15 |\n", + "| explained_variance | 0 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 572 |\n", + "| n_updates | 470 |\n", + "| policy_gradient_loss | -0.0811 |\n", + "| value_loss | 1.15e+03 |\n", + "----------------------------------------\n", "-----------------------------------------\n", "| rollout/ | |\n", "| ep_len_mean | 6 |\n", - "| ep_rew_mean | -121 |\n", + "| ep_rew_mean | -125 |\n", "| time/ | |\n", - "| fps | 533 |\n", + "| fps | 323 |\n", "| iterations | 49 |\n", - "| time_elapsed | 188 |\n", + "| time_elapsed | 310 |\n", "| total_timesteps | 100352 |\n", "| train/ | |\n", - "| approx_kl | 0.048466682 |\n", - "| clip_fraction | 0.511 |\n", + "| approx_kl | 0.039147377 |\n", + "| clip_fraction | 0.465 |\n", "| clip_range | 0.2 |\n", - "| entropy_loss | -6.52 |\n", - "| explained_variance | 0 |\n", + "| entropy_loss | -6.07 |\n", + "| explained_variance | 1.19e-07 |\n", "| learning_rate | 0.0003 |\n", - "| loss | 624 |\n", + "| loss | 523 |\n", "| n_updates | 480 |\n", - "| policy_gradient_loss | -0.0834 |\n", - "| value_loss | 1.15e+03 |\n", + "| policy_gradient_loss | -0.0778 |\n", + "| value_loss | 1.16e+03 |\n", "-----------------------------------------\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1083,7 +1083,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -1092,7 +1092,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -1101,7 +1101,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1115,7 +1115,7 @@ "source": [ "env = gym_wordle.wordle.WordleEnv()\n", "\n", - "for i in range(1):\n", + "for i in range(1000):\n", " \n", " state = env.reset()\n", "\n", diff --git a/gym_wordle/__init__.py b/gym_wordle/__init__.py new file mode 100644 index 0000000..9efa1cd --- /dev/null +++ b/gym_wordle/__init__.py @@ -0,0 +1,7 @@ +from gym.envs.registration import register +from .wordle import WordleEnv + +register( + id='Wordle-v0', + entry_point='gym_wordle.wordle:WordleEnv' +) diff --git a/gym_wordle/dictionary/guess_list.csv b/gym_wordle/dictionary/guess_list.csv new file mode 100644 index 0000000..670b1bb --- /dev/null +++ b/gym_wordle/dictionary/guess_list.csv @@ -0,0 +1,12972 @@ +aahed +aalii +aargh +aarti +abaca +abaci +aback +abacs +abaft +abaka +abamp +aband +abase +abash +abask +abate +abaya +abbas +abbed +abbes +abbey +abbot +abcee +abeam +abear +abele +abers +abets +abhor +abide +abies +abled +abler +ables +ablet +ablow +abmho +abode +abohm +aboil +aboma +aboon +abord +abore +abort +about +above +abram +abray +abrim +abrin +abris +absey +absit +abuna +abune +abuse +abuts +abuzz +abyes +abysm +abyss +acais +acari +accas +accoy +acerb +acers +aceta +achar +ached +aches +achoo +acids +acidy +acing +acini +ackee +acker +acmes +acmic +acned +acnes +acock +acold +acorn +acred +acres +acrid +acros +acted +actin +acton +actor +acute +acyls +adage +adapt +adaws +adays +adbot +addax +added +adder +addio +addle +adeem +adept +adhan +adieu +adios +adits +adman +admen +admin +admit +admix +adobe +adobo +adopt +adore +adorn +adown +adoze +adrad +adred +adsum +aduki +adult +adunc +adust +advew +adyta +adzed +adzes +aecia +aedes +aegis +aeons +aerie +aeros +aesir +afald +afara +afars +afear +affix +afire +aflaj +afoot +afore +afoul +afrit +afros +after +again +agama +agami +agape +agars +agast +agate +agave +agaze +agene +agent +agers +agger +aggie +aggri +aggro +aggry +aghas +agila +agile +aging +agios +agism +agist +agita +aglee +aglet +agley +agloo +aglow +aglus +agmas +agoge +agone +agons +agony +agood +agora +agree +agria +agrin +agros +agued +agues +aguna +aguti +ahead +aheap +ahent +ahigh +ahind +ahing +ahint +ahold +ahull +ahuru +aidas +aided +aider +aides +aidoi +aidos +aiery +aigas +aight +ailed +aimed +aimer +ainee +ainga +aioli +aired +airer +airns +airth +airts +aisle +aitch +aitus +aiver +aiyee +aizle +ajies +ajiva +ajuga +ajwan +akees +akela +akene +aking +akita +akkas +alaap +alack +alamo +aland +alane +alang +alans +alant +alapa +alaps +alarm +alary +alate +alays +albas +albee +album +alcid +alcos +aldea +alder +aldol +aleck +alecs +alefs +aleft +aleph +alert +alews +aleye +alfas +algae +algal +algas +algid +algin +algor +algum +alias +alibi +alien +alifs +align +alike +aline +alist +alive +aliya +alkie +alkos +alkyd +alkyl +allay +allee +allel +alley +allis +allod +allot +allow +alloy +allyl +almah +almas +almeh +almes +almud +almug +alods +aloed +aloes +aloft +aloha +aloin +alone +along +aloof +aloos +aloud +alowe +alpha +altar +alter +altho +altos +alula +alums +alure +alvar +alway +amahs +amain +amass +amate +amaut +amaze +amban +amber +ambit +amble +ambos +ambry +ameba +ameer +amend +amene +amens +ament +amias +amice +amici +amide +amido +amids +amies +amiga +amigo +amine +amino +amins +amirs +amiss +amity +amlas +amman +ammon +ammos +amnia +amnic +amnio +amoks +amole +among +amort +amour +amove +amowt +amped +ample +amply +ampul +amrit +amuck +amuse +amyls +anana +anata +ancho +ancle +ancon +andro +anear +anele +anent +angas +angel +anger +angle +anglo +angry +angst +anigh +anile +anils +anima +anime +animi +anion +anise +anker +ankhs +ankle +ankus +anlas +annal +annas +annat +annex +annoy +annul +anoas +anode +anole +anomy +ansae +antae +antar +antas +anted +antes +antic +antis +antra +antre +antsy +anura +anvil +anyon +aorta +apace +apage +apaid +apart +apayd +apays +apeak +apeek +apers +apert +apery +apgar +aphid +aphis +apian +aping +apiol +apish +apism +apnea +apode +apods +apoop +aport +appal +appay +appel +apple +apply +appro +appui +appuy +apres +apron +apses +apsis +apsos +apted +apter +aptly +aquae +aquas +araba +araks +arame +arars +arbas +arbor +arced +archi +arcos +arcus +ardeb +ardor +ardri +aread +areae +areal +arear +areas +areca +aredd +arede +arefy +areic +arena +arene +arepa +arere +arete +arets +arett +argal +argan +argil +argle +argol +argon +argot +argue +argus +arhat +arias +ariel +ariki +arils +ariot +arise +arish +arked +arled +arles +armed +armer +armet +armil +armor +arnas +arnut +aroba +aroha +aroid +aroma +arose +arpas +arpen +arrah +arras +array +arret +arris +arrow +arroz +arsed +arses +arsey +arsis +arson +artal +artel +artic +artis +artsy +aruhe +arums +arval +arvee +arvos +aryls +asana +ascon +ascot +ascus +asdic +ashed +ashen +ashes +ashet +aside +asked +asker +askew +askoi +askos +aspen +asper +aspic +aspie +aspis +aspro +assai +assam +assay +asses +asset +assez +assot +aster +astir +astun +asura +asway +aswim +asyla +ataps +ataxy +atigi +atilt +atimy +atlas +atman +atmas +atmos +atocs +atoke +atoks +atoll +atoms +atomy +atone +atony +atopy +atria +atrip +attap +attar +attic +atuas +audad +audio +audit +auger +aught +augur +aulas +aulic +auloi +aulos +aumil +aunes +aunts +aunty +aurae +aural +aurar +auras +aurei +aures +auric +auris +aurum +autos +auxin +avail +avale +avant +avast +avels +avens +avers +avert +avgas +avian +avine +avion +avise +aviso +avize +avoid +avows +avyze +await +awake +award +aware +awarn +awash +awato +awave +aways +awdls +aweel +aweto +awful +awing +awmry +awned +awner +awoke +awols +awork +axels +axial +axile +axils +axing +axiom +axion +axite +axled +axles +axman +axmen +axoid +axone +axons +ayahs +ayaya +ayelp +aygre +ayins +ayont +ayres +ayrie +azans +azide +azido +azine +azlon +azoic +azole +azons +azote +azoth +azuki +azure +azurn +azury +azygy +azyme +azyms +baaed +baals +babas +babel +babes +babka +baboo +babul +babus +bacca +bacco +baccy +bacha +bachs +backs +bacon +baddy +badge +badly +baels +baffs +baffy +bafts +bagel +baggy +baghs +bagie +bahts +bahus +bahut +bails +bairn +baisa +baith +baits +baiza +baize +bajan +bajra +bajri +bajus +baked +baken +baker +bakes +bakra +balas +balds +baldy +baled +baler +bales +balks +balky +balls +bally +balms +balmy +baloo +balsa +balti +balun +balus +bambi +banak +banal +banco +bancs +banda +bandh +bands +bandy +baned +banes +bangs +bania +banjo +banks +banns +bants +bantu +banty +banya +bapus +barbe +barbs +barby +barca +barde +bardo +bards +bardy +bared +barer +bares +barfi +barfs +barge +baric +barks +barky +barms +barmy +barns +barny +baron +barps +barra +barre +barro +barry +barye +basal +basan +based +basen +baser +bases +basho +basic +basij +basil +basin +basis +basks +bason +basse +bassi +basso +bassy +basta +baste +basti +basto +basts +batch +bated +bates +bathe +baths +batik +baton +batta +batts +battu +batty +bauds +bauks +baulk +baurs +bavin +bawds +bawdy +bawks +bawls +bawns +bawrs +bawty +bayed +bayer +bayes +bayle +bayou +bayts +bazar +bazoo +beach +beads +beady +beaks +beaky +beals +beams +beamy +beano +beans +beany +beard +beare +bears +beast +beath +beats +beaty +beaus +beaut +beaux +bebop +becap +becke +becks +bedad +bedel +bedes +bedew +bedim +bedye +beech +beedi +beefs +beefy +beeps +beers +beery +beets +befit +befog +begad +began +begar +begat +begem +beget +begin +begot +begum +begun +beige +beigy +being +beins +bekah +belah +belar +belay +belch +belee +belga +belie +belle +bells +belly +belon +below +belts +bemad +bemas +bemix +bemud +bench +bends +bendy +benes +benet +benga +benis +benne +benni +benny +bento +bents +benty +bepat +beray +beres +beret +bergs +berko +berks +berme +berms +berob +berry +berth +beryl +besat +besaw +besee +beses +beset +besit +besom +besot +besti +bests +betas +beted +betel +betes +beths +betid +beton +betta +betty +bevel +bever +bevor +bevue +bevvy +bewet +bewig +bezel +bezes +bezil +bezzy +bhais +bhaji +bhang +bhats +bhels +bhoot +bhuna +bhuts +biach +biali +bialy +bibbs +bibes +bible +biccy +bicep +bices +biddy +bided +bider +bides +bidet +bidis +bidon +bield +biers +biffo +biffs +biffy +bifid +bigae +biggs +biggy +bigha +bight +bigly +bigos +bigot +bijou +biked +biker +bikes +bikie +bilbo +bilby +biled +biles +bilge +bilgy +bilks +bills +billy +bimah +bimas +bimbo +binal +bindi +binds +biner +bines +binge +bingo +bings +bingy +binit +binks +bints +biogs +biome +biont +biota +biped +bipod +birch +birds +birks +birle +birls +biros +birrs +birse +birsy +birth +bises +bisks +bisom +bison +bitch +biter +bites +bitos +bitou +bitsy +bitte +bitts +bitty +bivia +bivvy +bizes +bizzo +bizzy +blabs +black +blade +blads +blady +blaer +blaes +blaff +blags +blahs +blain +blame +blams +bland +blank +blare +blart +blase +blash +blast +blate +blats +blatt +blaud +blawn +blaws +blays +blaze +bleak +blear +bleat +blebs +blech +bleed +bleep +blees +blend +blent +blert +bless +blest +blets +bleys +blimp +blimy +blind +bling +blini +blink +blins +bliny +blips +bliss +blist +blite +blits +blitz +blive +bloat +blobs +block +blocs +blogs +bloke +blond +blood +blook +bloom +bloop +blore +blots +blown +blows +blowy +blubs +blude +bluds +bludy +blued +bluer +blues +bluet +bluey +bluff +bluid +blume +blunk +blunt +blurb +blurs +blurt +blush +blype +boabs +boaks +board +boars +boart +boast +boats +bobac +bobak +bobas +bobby +bobol +bobos +bocca +bocce +bocci +boche +bocks +boded +bodes +bodge +bodhi +bodle +boeps +boets +boeuf +boffo +boffs +bogan +bogey +boggy +bogie +bogle +bogue +bogus +bohea +bohos +boils +boing +boink +boite +boked +bokeh +bokes +bokos +bolar +bolas +bolds +boles +bolix +bolls +bolos +bolts +bolus +bomas +bombe +bombo +bombs +bonce +bonds +boned +boner +bones +boney +bongo +bongs +bonie +bonks +bonne +bonny +bonus +bonza +bonze +booai +booay +boobs +booby +boody +booed +boofy +boogy +boohs +books +booky +bools +booms +boomy +boong +boons +boord +boors +boose +boost +booth +boots +booty +booze +boozy +boppy +borak +boral +boras +borax +borde +bords +bored +boree +borel +borer +bores +borgo +boric +borks +borms +borna +borne +boron +borts +borty +bortz +bosie +bosks +bosky +bosom +boson +bossy +bosun +botas +botch +botel +botes +bothy +botte +botts +botty +bouge +bough +bouks +boule +boult +bound +bouns +bourd +bourg +bourn +bouse +bousy +bouts +bovid +bowat +bowed +bowel +bower +bowes +bowet +bowie +bowls +bowne +bowrs +bowse +boxed +boxen +boxer +boxes +boxla +boxty +boyar +boyau +boyed +boyfs +boygs +boyla +boyos +boysy +bozos +braai +brace +brach +brack +bract +brads +braes +brags +braid +brail +brain +brake +braks +braky +brame +brand +brane +brank +brans +brant +brash +brass +brast +brats +brava +brave +bravi +bravo +brawl +brawn +braws +braxy +brays +braza +braze +bread +break +bream +brede +breds +breed +breem +breer +brees +breid +breis +breme +brens +brent +brere +brers +breve +brews +breys +briar +bribe +brick +bride +brief +brier +bries +brigs +briki +briks +brill +brims +brine +bring +brink +brins +briny +brios +brise +brisk +briss +brith +brits +britt +brize +broad +broch +brock +brods +brogh +brogs +broil +broke +brome +bromo +bronc +brond +brood +brook +brool +broom +broos +brose +brosy +broth +brown +brows +brugh +bruin +bruit +brule +brume +brung +brunt +brush +brusk +brust +brute +bruts +buats +buaze +bubal +bubas +bubba +bubbe +bubby +bubus +buchu +bucko +bucks +bucku +budas +buddy +budge +budis +budos +buffa +buffe +buffi +buffo +buffs +buffy +bufos +bufty +buggy +bugle +buhls +buhrs +buiks +build +built +buist +bukes +bulbs +bulge +bulgy +bulks +bulky +bulla +bulls +bully +bulse +bumbo +bumfs +bumph +bumps +bumpy +bunas +bunce +bunch +bunco +bunde +bundh +bunds +bundt +bundu +bundy +bungs +bungy +bunia +bunje +bunjy +bunko +bunks +bunns +bunny +bunts +bunty +bunya +buoys +buppy +buran +buras +burbs +burds +buret +burfi +burgh +burgs +burin +burka +burke +burks +burls +burly +burns +burnt +buroo +burps +burqa +burro +burrs +burry +bursa +burse +burst +busby +bused +buses +bushy +busks +busky +bussu +busti +busts +busty +butch +buteo +butes +butle +butoh +butte +butts +butty +butut +butyl +buxom +buyer +buzzy +bwana +bwazi +byded +bydes +byked +bykes +bylaw +byres +byrls +byssi +bytes +byway +caaed +cabal +cabas +cabby +caber +cabin +cable +cabob +caboc +cabre +cacao +cacas +cache +cacks +cacky +cacti +caddy +cadee +cades +cadet +cadge +cadgy +cadie +cadis +cadre +caeca +caese +cafes +caffs +caged +cager +cages +cagey +cagot +cahow +caids +cains +caird +cairn +cajon +cajun +caked +cakes +cakey +calfs +calid +calif +calix +calks +calla +calls +calms +calmy +calos +calpa +calps +calve +calyx +caman +camas +camel +cameo +cames +camis +camos +campi +campo +camps +campy +camus +canal +candy +caned +caneh +caner +canes +cangs +canid +canna +canns +canny +canoe +canon +canso +canst +canto +cants +canty +capas +caped +caper +capes +capex +caphs +capiz +caple +capon +capos +capot +capri +capul +caput +carap +carat +carbo +carbs +carby +cardi +cards +cardy +cared +carer +cares +caret +carex +cargo +carks +carle +carls +carns +carny +carob +carol +carom +caron +carpi +carps +carrs +carry +carse +carta +carte +carts +carve +carvy +casas +casco +cased +cases +casks +casky +caste +casts +casus +catch +cater +cates +catty +cauda +cauks +cauld +caulk +cauls +caums +caups +cauri +causa +cause +cavas +caved +cavel +caver +caves +cavie +cavil +cawed +cawks +caxon +cease +ceaze +cebid +cecal +cecum +cedar +ceded +ceder +cedes +cedis +ceiba +ceili +ceils +celeb +cella +celli +cello +cells +celom +celts +cense +cento +cents +centu +ceorl +cepes +cerci +cered +ceres +cerge +ceria +ceric +cerne +ceroc +ceros +certs +certy +cesse +cesta +cesti +cetes +cetyl +cezve +chace +chack +chaco +chado +chads +chafe +chaff +chaft +chain +chair +chais +chalk +chals +champ +chams +chana +chang +chank +chant +chaos +chape +chaps +chapt +chara +chard +chare +chark +charm +charr +chars +chart +chary +chase +chasm +chats +chave +chavs +chawk +chaws +chaya +chays +cheap +cheat +check +cheek +cheep +cheer +chefs +cheka +chela +chelp +chemo +chems +chere +chert +chess +chest +cheth +chevy +chews +chewy +chiao +chias +chibs +chica +chich +chick +chico +chics +chide +chief +chiel +chiks +child +chile +chili +chill +chimb +chime +chimo +chimp +china +chine +ching +chink +chino +chins +chips +chirk +chirl +chirm +chiro +chirp +chirr +chirt +chiru +chits +chive +chivs +chivy +chizz +chock +choco +chocs +chode +chogs +choil +choir +choke +choko +choky +chola +choli +cholo +chomp +chons +choof +chook +choom +choon +chops +chord +chore +chose +chota +chott +chout +choux +chowk +chows +chubs +chuck +chufa +chuff +chugs +chump +chums +chunk +churl +churn +churr +chuse +chute +chuts +chyle +chyme +chynd +cibol +cided +cider +cides +ciels +cigar +ciggy +cilia +cills +cimar +cimex +cinch +cinct +cines +cinqs +cions +cippi +circa +circs +cires +cirls +cirri +cisco +cissy +cists +cital +cited +citer +cites +cives +civet +civic +civie +civil +civvy +clach +clack +clade +clads +claes +clags +claim +clame +clamp +clams +clang +clank +clans +claps +clapt +claro +clart +clary +clash +clasp +class +clast +clats +claut +clave +clavi +claws +clays +clean +clear +cleat +cleck +cleek +cleep +clefs +cleft +clegs +cleik +clems +clepe +clept +clerk +cleve +clews +click +clied +clies +cliff +clift +climb +clime +cline +cling +clink +clint +clipe +clips +clipt +clits +cloak +cloam +clock +clods +cloff +clogs +cloke +clomb +clomp +clone +clonk +clons +cloop +cloot +clops +close +clote +cloth +clots +cloud +clour +clous +clout +clove +clown +clows +cloye +cloys +cloze +clubs +cluck +clued +clues +cluey +clump +clung +clunk +clype +cnida +coach +coact +coady +coala +coals +coaly +coapt +coarb +coast +coate +coati +coats +cobbs +cobby +cobia +coble +cobra +cobza +cocas +cocci +cocco +cocks +cocky +cocoa +cocos +codas +codec +coded +coden +coder +codes +codex +codon +coeds +coffs +cogie +cogon +cogue +cohab +cohen +cohoe +cohog +cohos +coifs +coign +coils +coins +coirs +coits +coked +cokes +colas +colby +colds +coled +coles +coley +colic +colin +colls +colly +colog +colon +color +colts +colza +comae +comal +comas +combe +combi +combo +combs +comby +comer +comes +comet +comfy +comic +comix +comma +commo +comms +commy +compo +comps +compt +comte +comus +conch +condo +coned +cones +coney +confs +conga +conge +congo +conia +conic +conin +conks +conky +conne +conns +conte +conto +conus +convo +cooch +cooed +cooee +cooer +cooey +coofs +cooks +cooky +cools +cooly +coomb +cooms +coomy +coons +coops +coopt +coost +coots +cooze +copal +copay +coped +copen +coper +copes +coppy +copra +copse +copsy +coqui +coral +coram +corbe +corby +cords +cored +corer +cores +corey +corgi +coria +corks +corky +corms +corni +corno +corns +cornu +corny +corps +corse +corso +cosec +cosed +coses +coset +cosey +cosie +costa +coste +costs +cotan +coted +cotes +coths +cotta +cotts +couch +coude +cough +could +count +coupe +coups +courb +courd +coure +cours +court +couta +couth +coved +coven +cover +coves +covet +covey +covin +cowal +cowan +cowed +cower +cowks +cowls +cowps +cowry +coxae +coxal +coxed +coxes +coxib +coyau +coyed +coyer +coyly +coypu +cozed +cozen +cozes +cozey +cozie +craal +crabs +crack +craft +crags +craic +craig +crake +crame +cramp +crams +crane +crank +crans +crape +craps +crapy +crare +crash +crass +crate +crave +crawl +craws +crays +craze +crazy +creak +cream +credo +creds +creed +creek +creel +creep +crees +creme +crems +crena +crepe +creps +crept +crepy +cress +crest +crewe +crews +crias +cribs +crick +cried +crier +cries +crime +crimp +crims +crine +crios +cripe +crips +crise +crisp +crith +crits +croak +croci +crock +crocs +croft +crogs +cromb +crome +crone +cronk +crons +crony +crook +crool +croon +crops +crore +cross +crost +croup +crout +crowd +crown +crows +croze +cruck +crude +crudo +cruds +crudy +cruel +crues +cruet +cruft +crumb +crump +crunk +cruor +crura +cruse +crush +crust +crusy +cruve +crwth +cryer +crypt +ctene +cubby +cubeb +cubed +cuber +cubes +cubic +cubit +cuddy +cuffo +cuffs +cuifs +cuing +cuish +cuits +cukes +culch +culet +culex +culls +cully +culms +culpa +culti +cults +culty +cumec +cumin +cundy +cunei +cunit +cunts +cupel +cupid +cuppa +cuppy +curat +curbs +curch +curds +curdy +cured +curer +cures +curet +curfs +curia +curie +curio +curli +curls +curly +curns +curny +currs +curry +curse +cursi +curst +curve +curvy +cusec +cushy +cusks +cusps +cuspy +cusso +cusum +cutch +cuter +cutes +cutey +cutie +cutin +cutis +cutto +cutty +cutup +cuvee +cuzes +cwtch +cyano +cyans +cyber +cycad +cycas +cycle +cyclo +cyder +cylix +cymae +cymar +cymas +cymes +cymol +cynic +cysts +cytes +cyton +czars +daals +dabba +daces +dacha +dacks +dadah +dadas +daddy +dados +daffs +daffy +dagga +daggy +dagos +dahls +daiko +daily +daine +daint +dairy +daisy +daker +daled +dales +dalis +dalle +dally +dalts +daman +damar +dames +damme +damns +damps +dampy +dance +dancy +dandy +dangs +danio +danks +danny +dants +daraf +darbs +darcy +dared +darer +dares +darga +dargs +daric +daris +darks +darky +darns +darre +darts +darzi +dashi +dashy +datal +dated +dater +dates +datos +datto +datum +daube +daubs +dauby +dauds +dault +daunt +daurs +dauts +daven +davit +dawah +dawds +dawed +dawen +dawks +dawns +dawts +dayan +daych +daynt +dazed +dazer +dazes +deads +deair +deals +dealt +deans +deare +dearn +dears +deary +deash +death +deave +deaws +deawy +debag +debar +debby +debel +debes +debit +debts +debud +debug +debur +debus +debut +debye +decad +decaf +decal +decan +decay +decko +decks +decor +decos +decoy +decry +dedal +deeds +deedy +deely +deems +deens +deeps +deere +deers +deets +deeve +deevs +defat +defer +deffo +defis +defog +degas +degum +degus +deice +deids +deify +deign +deils +deism +deist +deity +deked +dekes +dekko +delay +deled +deles +delfs +delft +delis +dells +delly +delos +delph +delta +delts +delve +deman +demes +demic +demit +demob +demoi +demon +demos +dempt +demur +denar +denay +dench +denes +denet +denim +denis +dense +dents +deoxy +depot +depth +derat +deray +derby +dered +deres +derig +derma +derms +derns +derny +deros +derro +derry +derth +dervs +desex +deshi +desis +desks +desse +deter +detox +deuce +devas +devel +devil +devis +devon +devos +devot +dewan +dewar +dewax +dewed +dexes +dexie +dhaba +dhaks +dhals +dhikr +dhobi +dhole +dholl +dhols +dhoti +dhows +dhuti +diact +dials +diane +diary +diazo +dibbs +diced +dicer +dices +dicey +dicht +dicks +dicky +dicot +dicta +dicts +dicty +diddy +didie +didos +didst +diebs +diels +diene +diets +diffs +dight +digit +dikas +diked +diker +dikes +dikey +dildo +dilli +dills +dilly +dimbo +dimer +dimes +dimly +dimps +dinar +dined +diner +dines +dinge +dingo +dings +dingy +dinic +dinks +dinky +dinna +dinos +dints +diode +diols +diota +dippy +dipso +diram +direr +dirge +dirke +dirks +dirls +dirts +dirty +disas +disci +disco +discs +dishy +disks +disme +dital +ditas +ditch +dited +dites +ditsy +ditto +ditts +ditty +ditzy +divan +divas +dived +diver +dives +divis +divna +divos +divot +divvy +diwan +dixie +dixit +diyas +dizen +dizzy +djinn +djins +doabs +doats +dobby +dobes +dobie +dobla +dobra +dobro +docht +docks +docos +docus +doddy +dodge +dodgy +dodos +doeks +doers +doest +doeth +doffs +dogan +doges +dogey +doggo +doggy +dogie +dogma +dohyo +doilt +doily +doing +doits +dojos +dolce +dolci +doled +doles +dolia +dolls +dolly +dolma +dolor +dolos +dolts +domal +domed +domes +domic +donah +donas +donee +doner +donga +dongs +donko +donna +donne +donny +donor +donsy +donut +doobs +dooce +doody +dooks +doole +dools +dooly +dooms +doomy +doona +doorn +doors +doozy +dopas +doped +doper +dopes +dopey +dorad +dorba +dorbs +doree +dores +doric +doris +dorks +dorky +dorms +dormy +dorps +dorrs +dorsa +dorse +dorts +dorty +dosai +dosas +dosed +doseh +doser +doses +dosha +dotal +doted +doter +dotes +dotty +douar +doubt +douce +doucs +dough +douks +doula +douma +doums +doups +doura +douse +douts +doved +doven +dover +doves +dovie +dowar +dowds +dowdy +dowed +dowel +dower +dowie +dowle +dowls +dowly +downa +downs +downy +dowps +dowry +dowse +dowts +doxed +doxes +doxie +doyen +doyly +dozed +dozen +dozer +dozes +drabs +drack +draco +draff +draft +drags +drail +drain +drake +drama +drams +drank +drant +drape +draps +drats +drave +drawl +drawn +draws +drays +dread +dream +drear +dreck +dreed +dreer +drees +dregs +dreks +drent +drere +dress +drest +dreys +dribs +drice +dried +drier +dries +drift +drill +drily +drink +drips +dript +drive +droid +droil +droit +droke +drole +droll +drome +drone +drony +droob +droog +drook +drool +droop +drops +dropt +dross +drouk +drove +drown +drows +drubs +drugs +druid +drums +drunk +drupe +druse +drusy +druxy +dryad +dryas +dryer +dryly +dsobo +dsomo +duads +duals +duans +duars +dubbo +ducal +ducat +duces +duchy +ducks +ducky +ducts +duddy +duded +dudes +duels +duets +duett +duffs +dufus +duing +duits +dukas +duked +dukes +dukka +dulce +dules +dulia +dulls +dully +dulse +dumas +dumbo +dumbs +dumka +dumky +dummy +dumps +dumpy +dunam +dunce +dunch +dunes +dungs +dungy +dunks +dunno +dunny +dunsh +dunts +duomi +duomo +duped +duper +dupes +duple +duply +duppy +dural +duras +dured +dures +durgy +durns +duroc +duros +duroy +durra +durrs +durry +durst +durum +durzi +dusks +dusky +dusts +dusty +dutch +duvet +duxes +dwaal +dwale +dwalm +dwams +dwang +dwarf +dwaum +dweeb +dwell +dwelt +dwile +dwine +dyads +dyers +dying +dyked +dykes +dykey +dykon +dynel +dynes +dzhos +eager +eagle +eagre +ealed +eales +eaned +eards +eared +earls +early +earns +earnt +earst +earth +eased +easel +easer +eases +easle +easts +eaten +eater +eathe +eaved +eaves +ebbed +ebbet +ebons +ebony +ebook +ecads +eched +eches +echos +eclat +ecrus +edema +edged +edger +edges +edict +edify +edile +edits +educe +educt +eejit +eensy +eerie +eeven +eevns +effed +egads +egers +egest +eggar +egged +egger +egmas +egret +ehing +eider +eidos +eight +eigne +eiked +eikon +eilds +eisel +eject +ejido +eking +ekkas +elain +eland +elans +elate +elbow +elchi +elder +eldin +elect +elegy +elemi +elfed +elfin +eliad +elide +elint +elite +elmen +eloge +elogy +eloin +elope +elops +elpee +elsin +elude +elute +elvan +elven +elver +elves +emacs +email +embar +embay +embed +ember +embog +embow +embox +embus +emcee +emeer +emend +emerg +emery +emeus +emics +emirs +emits +emmas +emmer +emmet +emmew +emmys +emoji +emong +emote +emove +empts +empty +emule +emure +emyde +emyds +enact +enarm +enate +ended +ender +endew +endow +endue +enema +enemy +enews +enfix +eniac +enjoy +enlit +enmew +ennog +ennui +enoki +enols +enorm +enows +enrol +ensew +ensky +ensue +enter +entia +entry +enure +enurn +envoi +envoy +enzym +eorls +eosin +epact +epees +ephah +ephas +ephod +ephor +epics +epoch +epode +epopt +epoxy +epris +equal +eques +equid +equip +erase +erbia +erect +erevs +ergon +ergos +ergot +erhus +erica +erick +erics +ering +erned +ernes +erode +erose +erred +error +erses +eruct +erugo +erupt +eruvs +erven +ervil +escar +escot +esile +eskar +esker +esnes +essay +esses +ester +estoc +estop +estro +etage +etape +etats +etens +ethal +ether +ethic +ethne +ethos +ethyl +etics +etnas +ettin +ettle +etude +etuis +etwee +etyma +eughs +euked +eupad +euros +eusol +evade +evens +event +evert +every +evets +evhoe +evict +evils +evite +evohe +evoke +ewers +ewest +ewhow +ewked +exact +exalt +exams +excel +exeat +execs +exeem +exeme +exert +exfil +exies +exile +exine +exing +exist +exits +exode +exome +exons +expat +expel +expos +extol +extra +exude +exuls +exult +exurb +eyass +eyers +eying +eyots +eyras +eyres +eyrie +eyrir +ezine +fabby +fable +faced +facer +faces +facet +facia +facta +facts +faddy +faded +fader +fades +fadge +fados +faena +faery +faffs +faffy +faggy +fagin +fagot +faiks +fails +faine +fains +faint +fairs +fairy +faith +faked +faker +fakes +fakey +fakie +fakir +falaj +falls +false +famed +fames +fanal +fancy +fands +fanes +fanga +fango +fangs +fanks +fanny +fanon +fanos +fanum +faqir +farad +farce +farci +farcy +fards +fared +farer +fares +farle +farls +farms +faros +farro +farse +farts +fasci +fasti +fasts +fatal +fated +fates +fatly +fatso +fatty +fatwa +faugh +fauld +fault +fauna +fauns +faurd +fauts +fauve +favas +favel +faver +faves +favor +favus +fawns +fawny +faxed +faxes +fayed +fayer +fayne +fayre +fazed +fazes +feals +feare +fears +feart +fease +feast +feats +feaze +fecal +feces +fecht +fecit +fecks +fedex +feebs +feeds +feels +feens +feers +feese +feeze +fehme +feign +feint +feist +felch +felid +fella +fells +felly +felon +felts +felty +femal +femes +femme +femmy +femur +fence +fends +fendy +fenis +fenks +fenny +fents +feods +feoff +feral +ferer +feres +feria +ferly +fermi +ferms +ferns +ferny +ferry +fesse +festa +fests +festy +fetal +fetas +fetch +feted +fetes +fetid +fetor +fetta +fetts +fetus +fetwa +feuar +feuds +feued +fever +fewer +feyed +feyer +feyly +fezes +fezzy +fiars +fiats +fiber +fibre +fibro +fices +fiche +fichu +ficin +ficos +ficus +fides +fidge +fidos +fiefs +field +fiend +fient +fiere +fiers +fiery +fiest +fifed +fifer +fifes +fifis +fifth +fifty +figgy +fight +figos +fiked +fikes +filar +filch +filed +filer +files +filet +filii +filks +fille +fillo +fills +filly +filmi +films +filmy +filos +filth +filum +final +finca +finch +finds +fined +finer +fines +finis +finks +finny +finos +fiord +fiqhs +fique +fired +firer +fires +firie +firks +firms +firns +firry +first +firth +fiscs +fishy +fisks +fists +fisty +fitch +fitly +fitna +fitte +fitts +fiver +fives +fixed +fixer +fixes +fixit +fizzy +fjeld +fjord +flabs +flack +flaff +flags +flail +flair +flake +flaks +flaky +flame +flamm +flams +flamy +flane +flank +flans +flaps +flare +flary +flash +flask +flats +flava +flawn +flaws +flawy +flaxy +flays +fleam +fleas +fleck +fleek +fleer +flees +fleet +flegs +fleme +flesh +fleur +flews +flexi +flexo +fleys +flick +flics +flied +flier +flies +flimp +flims +fling +flint +flips +flirs +flirt +flisk +flite +flits +flitt +float +flobs +flock +flocs +floes +flogs +flong +flood +floor +flops +flora +flors +flory +flosh +floss +flota +flote +flour +flout +flown +flows +flubs +flued +flues +fluey +fluff +fluid +fluke +fluky +flume +flump +flung +flunk +fluor +flurr +flush +flute +fluty +fluyt +flyby +flyer +flype +flyte +foals +foams +foamy +focal +focus +foehn +fogey +foggy +fogie +fogle +fogou +fohns +foids +foils +foins +foist +folds +foley +folia +folic +folie +folio +folks +folky +folly +fomes +fonda +fonds +fondu +fones +fonly +fonts +foods +foody +fools +foots +footy +foram +foray +forbs +forby +force +fordo +fords +forel +fores +forex +forge +forgo +forks +forky +forme +forms +forte +forth +forts +forty +forum +forza +forze +fossa +fosse +fouat +fouds +fouer +fouet +foule +fouls +found +fount +fours +fouth +fovea +fowls +fowth +foxed +foxes +foxie +foyer +foyle +foyne +frabs +frack +fract +frags +frail +fraim +frame +franc +frank +frape +fraps +frass +frate +frati +frats +fraud +fraus +frays +freak +freed +freer +frees +freet +freit +fremd +frena +freon +frere +fresh +frets +friar +fribs +fried +frier +fries +frigs +frill +frise +frisk +frist +frith +frits +fritt +fritz +frize +frizz +frock +froes +frogs +frond +frons +front +frore +frorn +frory +frosh +frost +froth +frown +frows +frowy +froze +frugs +fruit +frump +frush +frust +fryer +fubar +fubby +fubsy +fucks +fucus +fuddy +fudge +fudgy +fuels +fuero +fuffs +fuffy +fugal +fuggy +fugie +fugio +fugle +fugly +fugue +fugus +fujis +fulls +fully +fumed +fumer +fumes +fumet +fundi +funds +fundy +fungi +fungo +fungs +funks +funky +funny +fural +furan +furca +furls +furol +furor +furrs +furry +furth +furze +furzy +fused +fusee +fusel +fuses +fusil +fusks +fussy +fusts +fusty +futon +fuzed +fuzee +fuzes +fuzil +fuzzy +fyces +fyked +fykes +fyles +fyrds +fytte +gabba +gabby +gable +gaddi +gades +gadge +gadid +gadis +gadje +gadjo +gadso +gaffe +gaffs +gaged +gager +gages +gaids +gaily +gains +gairs +gaita +gaits +gaitt +gajos +galah +galas +galax +galea +galed +gales +galls +gally +galop +galut +galvo +gamas +gamay +gamba +gambe +gambo +gambs +gamed +gamer +games +gamey +gamic +gamin +gamma +gamme +gammy +gamps +gamut +ganch +gandy +ganef +ganev +gangs +ganja +ganof +gants +gaols +gaped +gaper +gapes +gapos +gappy +garbe +garbo +garbs +garda +gares +garis +garms +garni +garre +garth +garum +gases +gasps +gaspy +gassy +gasts +gatch +gated +gater +gates +gaths +gator +gauch +gaucy +gauds +gaudy +gauge +gauje +gault +gaums +gaumy +gaunt +gaups +gaurs +gauss +gauze +gauzy +gavel +gavot +gawcy +gawds +gawks +gawky +gawps +gawsy +gayal +gayer +gayly +gazal +gazar +gazed +gazer +gazes +gazon +gazoo +geals +geans +geare +gears +geats +gebur +gecko +gecks +geeks +geeky +geeps +geese +geest +geist +geits +gelds +gelee +gelid +gelly +gelts +gemel +gemma +gemmy +gemot +genal +genas +genes +genet +genic +genie +genii +genip +genny +genoa +genom +genre +genro +gents +genty +genua +genus +geode +geoid +gerah +gerbe +geres +gerle +germs +germy +gerne +gesse +gesso +geste +gests +getas +getup +geums +geyan +geyer +ghast +ghats +ghaut +ghazi +ghees +ghest +ghost +ghoul +ghyll +giant +gibed +gibel +giber +gibes +gibli +gibus +giddy +gifts +gigas +gighe +gigot +gigue +gilas +gilds +gilet +gills +gilly +gilpy +gilts +gimel +gimme +gimps +gimpy +ginch +ginge +gings +ginks +ginny +ginzo +gipon +gippo +gippy +gipsy +girds +girls +girly +girns +giron +giros +girrs +girsh +girth +girts +gismo +gisms +gists +gitch +gites +giust +gived +given +giver +gives +gizmo +glace +glade +glads +glady +glaik +glair +glams +gland +glans +glare +glary +glass +glaum +glaur +glaze +glazy +gleam +glean +gleba +glebe +gleby +glede +gleds +gleed +gleek +glees +gleet +gleis +glens +glent +gleys +glial +glias +glibs +glide +gliff +glift +glike +glime +glims +glint +glisk +glits +glitz +gloam +gloat +globe +globi +globs +globy +glode +glogg +gloms +gloom +gloop +glops +glory +gloss +glost +glout +glove +glows +gloze +glued +gluer +glues +gluey +glugs +glume +glums +gluon +glute +gluts +glyph +gnarl +gnarr +gnars +gnash +gnats +gnawn +gnaws +gnome +gnows +goads +goafs +goals +goary +goats +goaty +goban +gobar +gobbi +gobbo +gobby +gobis +gobos +godet +godly +godso +goels +goers +goest +goeth +goety +gofer +goffs +gogga +gogos +goier +going +gojis +golds +goldy +golem +goles +golfs +golly +golpe +golps +gombo +gomer +gompa +gonad +gonch +gonef +goner +gongs +gonia +gonif +gonks +gonna +gonof +gonys +gonzo +gooby +goods +goody +gooey +goofs +goofy +googs +gooks +gooky +goold +gools +gooly +goons +goony +goops +goopy +goors +goory +goose +goosy +gopak +gopik +goral +goras +gored +gores +gorge +goris +gorms +gormy +gorps +gorse +gorsy +gosht +gosse +gotch +goths +gothy +gotta +gouch +gouge +gouks +goura +gourd +gouts +gouty +gowan +gowds +gowfs +gowks +gowls +gowns +goxes +goyim +goyle +graal +grabs +grace +grade +grads +graff +graft +grail +grain +graip +grama +grame +gramp +grams +grana +grand +grans +grant +grape +graph +grapy +grasp +grass +grate +grave +gravs +gravy +grays +graze +great +grebe +grebo +grece +greed +greek +green +grees +greet +grege +grego +grein +grens +grese +greve +grews +greys +grice +gride +grids +grief +griff +grift +grigs +grike +grill +grime +grimy +grind +grins +griot +gripe +grips +gript +gripy +grise +grist +grisy +grith +grits +grize +groan +groat +grody +grogs +groin +groks +groma +grone +groof +groom +grope +gross +grosz +grots +grouf +group +grout +grove +grovy +growl +grown +grows +grrls +grrrl +grubs +grued +gruel +grues +grufe +gruff +grume +grump +grund +grunt +gryce +gryde +gryke +grype +grypt +guaco +guana +guano +guans +guard +guars +guava +gucks +gucky +gudes +guess +guest +guffs +gugas +guide +guids +guild +guile +guilt +guimp +guiro +guise +gulag +gular +gulas +gulch +gules +gulet +gulfs +gulfy +gulls +gully +gulph +gulps +gulpy +gumbo +gumma +gummi +gummy +gumps +gundy +gunge +gungy +gunks +gunky +gunny +guppy +guqin +gurdy +gurge +gurls +gurly +gurns +gurry +gursh +gurus +gushy +gusla +gusle +gusli +gussy +gusto +gusts +gusty +gutsy +gutta +gutty +guyed +guyle +guyot +guyse +gwine +gyals +gyans +gybed +gybes +gyeld +gymps +gynae +gynie +gynny +gynos +gyoza +gypos +gyppo +gyppy +gypsy +gyral +gyred +gyres +gyron +gyros +gyrus +gytes +gyved +gyves +haafs +haars +habit +hable +habus +hacek +hacks +hadal +haded +hades +hadji +hadst +haems +haets +haffs +hafiz +hafts +haggs +hahas +haick +haika +haiks +haiku +hails +haily +hains +haint +hairs +hairy +haith +hajes +hajis +hajji +hakam +hakas +hakea +hakes +hakim +hakus +halal +haled +haler +hales +halfa +halfs +halid +hallo +halls +halma +halms +halon +halos +halse +halts +halva +halve +halwa +hamal +hamba +hamed +hames +hammy +hamza +hanap +hance +hanch +hands +handy +hangi +hangs +hanks +hanky +hansa +hanse +hants +haole +haoma +hapax +haply +happi +happy +hapus +haram +hards +hardy +hared +harem +hares +harim +harks +harls +harms +harns +haros +harps +harpy +harry +harsh +harts +hashy +hasks +hasps +hasta +haste +hasty +hatch +hated +hater +hates +hatha +hauds +haufs +haugh +hauld +haulm +hauls +hault +hauns +haunt +hause +haute +haven +haver +haves +havoc +hawed +hawks +hawms +hawse +hayed +hayer +hayey +hayle +hazan +hazed +hazel +hazer +hazes +heads +heady +heald +heals +heame +heaps +heapy +heard +heare +hears +heart +heast +heath +heats +heave +heavy +heben +hebes +hecht +hecks +heder +hedge +hedgy +heeds +heedy +heels +heeze +hefte +hefts +hefty +heids +heigh +heils +heirs +heist +hejab +hejra +heled +heles +helio +helix +hello +hells +helms +helos +helot +helps +helve +hemal +hemes +hemic +hemin +hemps +hempy +hence +hench +hends +henge +henna +henny +henry +hents +hepar +herbs +herby +herds +heres +herls +herma +herms +herns +heron +heros +herry +herse +hertz +herye +hesps +hests +hetes +heths +heuch +heugh +hevea +hewed +hewer +hewgh +hexad +hexed +hexer +hexes +hexyl +heyed +hiant +hicks +hided +hider +hides +hiems +highs +hight +hijab +hijra +hiked +hiker +hikes +hikoi +hilar +hilch +hillo +hills +hilly +hilts +hilum +hilus +himbo +hinau +hinds +hinge +hings +hinky +hinny +hints +hiois +hiply +hippo +hippy +hired +hiree +hirer +hires +hissy +hists +hitch +hithe +hived +hiver +hives +hizen +hoaed +hoagy +hoard +hoars +hoary +hoast +hobby +hobos +hocks +hocus +hodad +hodja +hoers +hogan +hogen +hoggs +hoghs +hohed +hoick +hoied +hoiks +hoing +hoise +hoist +hokas +hoked +hokes +hokey +hokis +hokku +hokum +holds +holed +holes +holey +holks +holla +hollo +holly +holme +holms +holon +holos +holts +homas +homed +homer +homes +homey +homie +homme +homos +honan +honda +honds +honed +honer +hones +honey +hongi +hongs +honks +honky +honor +hooch +hoods +hoody +hooey +hoofs +hooka +hooks +hooky +hooly +hoons +hoops +hoord +hoors +hoosh +hoots +hooty +hoove +hopak +hoped +hoper +hopes +hoppy +horah +horal +horas +horde +horis +horks +horme +horns +horny +horse +horst +horsy +hosed +hosel +hosen +hoser +hoses +hosey +hosta +hosts +hotch +hotel +hoten +hotly +hotty +houff +houfs +hough +hound +houri +hours +house +houts +hovea +hoved +hovel +hoven +hover +hoves +howbe +howdy +howes +howff +howfs +howks +howls +howre +howso +hoxed +hoxes +hoyas +hoyed +hoyle +hubby +hucks +hudna +hudud +huers +huffs +huffy +huger +huggy +huhus +huias +hulas +hules +hulks +hulky +hullo +hulls +hully +human +humas +humfs +humic +humid +humor +humph +humps +humpy +humus +hunch +hunks +hunky +hunts +hurds +hurls +hurly +hurra +hurry +hurst +hurts +hushy +husks +husky +husos +hussy +hutch +hutia +huzza +huzzy +hwyls +hydra +hydro +hyena +hyens +hygge +hying +hykes +hylas +hyleg +hyles +hylic +hymen +hymns +hynde +hyoid +hyped +hyper +hypes +hypha +hyphy +hypos +hyrax +hyson +hythe +iambi +iambs +ibrik +icers +iched +iches +ichor +icier +icily +icing +icker +ickle +icons +ictal +ictic +ictus +idant +ideal +ideas +idees +ident +idiom +idiot +idled +idler +idles +idola +idols +idyll +idyls +iftar +igapo +igged +igloo +iglus +ihram +ikans +ikats +ikons +ileac +ileal +ileum +ileus +iliac +iliad +ilial +ilium +iller +illth +image +imago +imams +imari +imaum +imbar +imbed +imbue +imide +imido +imids +imine +imino +immew +immit +immix +imped +impel +impis +imply +impot +impro +imshi +imshy +inane +inapt +inarm +inbox +inbye +incel +incle +incog +incur +incus +incut +indew +index +india +indie +indol +indow +indri +indue +inept +inerm +inert +infer +infix +infos +infra +ingan +ingle +ingot +inion +inked +inker +inkle +inlay +inlet +inned +inner +innit +inorb +input +inrun +inset +inspo +intel +inter +intil +intis +intra +intro +inula +inure +inurn +inust +invar +inwit +iodic +iodid +iodin +ionic +iotas +ippon +irade +irate +irids +iring +irked +iroko +irone +irons +irony +isbas +ishes +isled +isles +islet +isnae +issei +issue +istle +itchy +items +ither +ivied +ivies +ivory +ixias +ixnay +ixora +ixtle +izard +izars +izzat +jaaps +jabot +jacal +jacks +jacky +jaded +jades +jafas +jaffa +jagas +jager +jaggs +jaggy +jagir +jagra +jails +jaker +jakes +jakey +jalap +jalop +jambe +jambo +jambs +jambu +james +jammy +jamon +janes +janns +janny +janty +japan +japed +japer +japes +jarks +jarls +jarps +jarta +jarul +jasey +jaspe +jasps +jatos +jauks +jaunt +jaups +javas +javel +jawan +jawed +jaxie +jazzy +jeans +jeats +jebel +jedis +jeels +jeely +jeeps +jeers +jeeze +jefes +jeffs +jehad +jehus +jelab +jello +jells +jelly +jembe +jemmy +jenny +jeons +jerid +jerks +jerky +jerry +jesse +jests +jesus +jetes +jeton +jetty +jeune +jewed +jewel +jewie +jhala +jiaos +jibba +jibbs +jibed +jiber +jibes +jiffs +jiffy +jiggy +jigot +jihad +jills +jilts +jimmy +jimpy +jingo +jinks +jinne +jinni +jinns +jirds +jirga +jirre +jisms +jived +jiver +jives +jivey +jnana +jobed +jobes +jocko +jocks +jocky +jocos +jodel +joeys +johns +joins +joint +joist +joked +joker +jokes +jokey +jokol +joled +joles +jolls +jolly +jolts +jolty +jomon +jomos +jones +jongs +jonty +jooks +joram +jorum +jotas +jotty +jotun +joual +jougs +jouks +joule +jours +joust +jowar +jowed +jowls +jowly +joyed +jubas +jubes +jucos +judas +judge +judgy +judos +jugal +jugum +juice +juicy +jujus +juked +jukes +jukus +julep +jumar +jumbo +jumby +jumps +jumpy +junco +junks +junky +junta +junto +jupes +jupon +jural +jurat +jurel +jures +juror +justs +jutes +jutty +juves +juvie +kaama +kabab +kabar +kabob +kacha +kacks +kadai +kades +kadis +kafir +kagos +kagus +kahal +kaiak +kaids +kaies +kaifs +kaika +kaiks +kails +kaims +kaing +kains +kakas +kakis +kalam +kales +kalif +kalis +kalpa +kamas +kames +kamik +kamis +kamme +kanae +kanas +kandy +kaneh +kanes +kanga +kangs +kanji +kants +kanzu +kaons +kapas +kaphs +kapok +kapow +kappa +kapus +kaput +karas +karat +karks +karma +karns +karoo +karos +karri +karst +karsy +karts +karzy +kasha +kasme +katal +katas +katis +katti +kaugh +kauri +kauru +kaury +kaval +kavas +kawas +kawau +kawed +kayak +kayle +kayos +kazis +kazoo +kbars +kebab +kebar +kebob +kecks +kedge +kedgy +keech +keefs +keeks +keels +keema +keeno +keens +keeps +keets +keeve +kefir +kehua +keirs +kelep +kelim +kells +kelly +kelps +kelpy +kelts +kelty +kembo +kembs +kemps +kempt +kempy +kenaf +kench +kendo +kenos +kente +kents +kepis +kerbs +kerel +kerfs +kerky +kerma +kerne +kerns +keros +kerry +kerve +kesar +kests +ketas +ketch +ketes +ketol +kevel +kevil +kexes +keyed +keyer +khadi +khafs +khaki +khans +khaph +khats +khaya +khazi +kheda +kheth +khets +khoja +khors +khoum +khuds +kiaat +kiack +kiang +kibbe +kibbi +kibei +kibes +kibla +kicks +kicky +kiddo +kiddy +kidel +kidge +kiefs +kiers +kieve +kievs +kight +kikes +kikoi +kiley +kilim +kills +kilns +kilos +kilps +kilts +kilty +kimbo +kinas +kinda +kinds +kindy +kines +kings +kinin +kinks +kinky +kinos +kiore +kiosk +kipes +kippa +kipps +kirby +kirks +kirns +kirri +kisan +kissy +kists +kited +kiter +kites +kithe +kiths +kitty +kitul +kivas +kiwis +klang +klaps +klett +klick +klieg +kliks +klong +kloof +kluge +klutz +knack +knags +knaps +knarl +knars +knaur +knave +knawe +knead +kneed +kneel +knees +knell +knelt +knife +knish +knits +knive +knobs +knock +knoll +knops +knosp +knots +knout +knowe +known +knows +knubs +knurl +knurr +knurs +knuts +koala +koans +koaps +koban +kobos +koels +koffs +kofta +kogal +kohas +kohen +kohls +koine +kojis +kokam +kokas +koker +kokra +kokum +kolas +kolos +kombu +konbu +kondo +konks +kooks +kooky +koori +kopek +kophs +kopje +koppa +korai +koras +korat +kores +korma +koros +korun +korus +koses +kotch +kotos +kotow +koura +kraal +krabs +kraft +krais +krait +krang +krans +kranz +kraut +krays +kreep +kreng +krewe +krill +krona +krone +kroon +krubi +krunk +ksars +kubie +kudos +kudus +kudzu +kufis +kugel +kuias +kukri +kukus +kulak +kulan +kulas +kulfi +kumis +kumys +kuris +kurre +kurta +kurus +kusso +kutas +kutch +kutis +kutus +kuzus +kvass +kvell +kwela +kyack +kyaks +kyang +kyars +kyats +kybos +kydst +kyles +kylie +kylin +kylix +kyloe +kynde +kynds +kypes +kyrie +kytes +kythe +laari +labda +label +labia +labis +labor +labra +laced +lacer +laces +lacet +lacey +lacks +laddy +laded +laden +lader +lades +ladle +laers +laevo +lagan +lager +lahal +lahar +laich +laics +laids +laigh +laika +laiks +laird +lairs +lairy +laith +laity +laked +laker +lakes +lakhs +lakin +laksa +laldy +lalls +lamas +lambs +lamby +lamed +lamer +lames +lamia +lammy +lamps +lanai +lanas +lance +lanch +lande +lands +lanes +lanks +lanky +lants +lapel +lapin +lapis +lapje +lapse +larch +lards +lardy +laree +lares +large +largo +laris +larks +larky +larns +larnt +larum +larva +lased +laser +lases +lassi +lasso +lassu +lassy +lasts +latah +latch +lated +laten +later +latex +lathe +lathi +laths +lathy +latke +latte +latus +lauan +lauch +lauds +laufs +laugh +laund +laura +laval +lavas +laved +laver +laves +lavra +lavvy +lawed +lawer +lawin +lawks +lawns +lawny +laxed +laxer +laxes +laxly +layed +layer +layin +layup +lazar +lazed +lazes +lazos +lazzi +lazzo +leach +leads +leady +leafs +leafy +leaks +leaky +leams +leans +leant +leany +leaps +leapt +leare +learn +lears +leary +lease +leash +least +leats +leave +leavy +leaze +leben +leccy +ledes +ledge +ledgy +ledum +leear +leech +leeks +leeps +leers +leery +leese +leets +leeze +lefte +lefts +lefty +legal +leger +leges +legge +leggo +leggy +legit +lehrs +lehua +leirs +leish +leman +lemed +lemel +lemes +lemma +lemme +lemon +lemur +lends +lenes +lengs +lenis +lenos +lense +lenti +lento +leone +leper +lepid +lepra +lepta +lered +leres +lerps +lesbo +leses +lests +letch +lethe +letup +leuch +leuco +leuds +leugh +levas +levee +level +lever +leves +levin +levis +lewis +lexes +lexis +lezes +lezza +lezzy +liana +liane +liang +liard +liars +liart +libel +liber +libra +libri +lichi +licht +licit +licks +lidar +lidos +liefs +liege +liens +liers +lieus +lieve +lifer +lifes +lifts +ligan +liger +ligge +light +ligne +liked +liken +liker +likes +likin +lilac +lills +lilos +lilts +liman +limas +limax +limba +limbi +limbo +limbs +limby +limed +limen +limes +limey +limit +limma +limns +limos +limpa +limps +linac +linch +linds +lindy +lined +linen +liner +lines +liney +linga +lingo +lings +lingy +linin +links +linky +linns +linny +linos +lints +linty +linum +linux +lions +lipas +lipes +lipid +lipin +lipos +lippy +liras +lirks +lirot +lisks +lisle +lisps +lists +litai +litas +lited +liter +lites +lithe +litho +liths +litre +lived +liven +liver +lives +livid +livor +livre +llama +llano +loach +loads +loafs +loams +loamy +loans +loast +loath +loave +lobar +lobby +lobed +lobes +lobos +lobus +local +loche +lochs +locie +locis +locks +locos +locum +locus +loden +lodes +lodge +loess +lofts +lofty +logan +loges +loggy +logia +logic +logie +login +logoi +logon +logos +lohan +loids +loins +loipe +loirs +lokes +lolls +lolly +lolog +lomas +lomed +lomes +loner +longa +longe +longs +looby +looed +looey +loofa +loofs +looie +looks +looky +looms +loons +loony +loops +loopy +loord +loose +loots +loped +loper +lopes +loppy +loral +loran +lords +lordy +lorel +lores +loric +loris +lorry +losed +losel +losen +loser +loses +lossy +lotah +lotas +lotes +lotic +lotos +lotsa +lotta +lotte +lotto +lotus +loued +lough +louie +louis +louma +lound +louns +loupe +loups +loure +lours +loury +louse +lousy +louts +lovat +loved +lover +loves +lovey +lovie +lowan +lowed +lower +lowes +lowly +lownd +lowne +lowns +lowps +lowry +lowse +lowts +loxed +loxes +loyal +lozen +luach +luaus +lubed +lubes +lubra +luces +lucid +lucks +lucky +lucre +ludes +ludic +ludos +luffa +luffs +luged +luger +luges +lulls +lulus +lumas +lumbi +lumen +lumme +lummy +lumps +lumpy +lunar +lunas +lunch +lunes +lunet +lunge +lungi +lungs +lunks +lunts +lupin +lupus +lurch +lured +lurer +lures +lurex +lurgi +lurgy +lurid +lurks +lurry +lurve +luser +lushy +lusks +lusts +lusty +lusus +lutea +luted +luter +lutes +luvvy +luxed +luxer +luxes +lweis +lyams +lyard +lyart +lyase +lycea +lycee +lycra +lying +lymes +lymph +lynch +lynes +lyres +lyric +lysed +lyses +lysin +lysis +lysol +lyssa +lyted +lytes +lythe +lytic +lytta +maaed +maare +maars +mabes +macas +macaw +maced +macer +maces +mache +machi +macho +machs +macks +macle +macon +macro +madam +madge +madid +madly +madre +maerl +mafia +mafic +mages +maggs +magic +magma +magot +magus +mahoe +mahua +mahwa +maids +maiko +maiks +maile +maill +mails +maims +mains +maire +mairs +maise +maist +maize +major +makar +maker +makes +makis +makos +malam +malar +malas +malax +males +malic +malik +malis +malls +malms +malmy +malts +malty +malus +malva +malwa +mamas +mamba +mambo +mamee +mamey +mamie +mamma +mammy +manas +manat +mandi +maneb +maned +maneh +manes +manet +manga +mange +mango +mangs +mangy +mania +manic +manis +manky +manly +manna +manor +manos +manse +manta +manto +manty +manul +manus +mapau +maple +maqui +marae +marah +maras +march +marcs +mardy +mares +marge +margs +maria +marid +marka +marks +marle +marls +marly +marms +maron +maror +marra +marri +marry +marse +marsh +marts +marvy +masas +mased +maser +mases +mashy +masks +mason +massa +masse +massy +masts +masty +masus +matai +match +mated +mater +mates +matey +maths +matin +matlo +matte +matts +matza +matzo +mauby +mauds +mauls +maund +mauri +mausy +mauts +mauve +mauzy +maven +mavie +mavin +mavis +mawed +mawks +mawky +mawns +mawrs +maxed +maxes +maxim +maxis +mayan +mayas +maybe +mayed +mayor +mayos +mayst +mazed +mazer +mazes +mazey +mazut +mbira +meads +meals +mealy +meane +means +meant +meany +meare +mease +meath +meats +meaty +mebos +mecca +mechs +mecks +medal +media +medic +medii +medle +meeds +meers +meets +meffs +meins +meint +meiny +meith +mekka +melas +melba +melds +melee +melic +melik +mells +melon +melts +melty +memes +memos +menad +mends +mened +menes +menge +mengs +mensa +mense +mensh +menta +mento +menus +meous +meows +merch +mercs +mercy +merde +mered +merel +merer +meres +merge +meril +meris +merit +merks +merle +merls +merry +merse +mesal +mesas +mesel +meses +meshy +mesic +mesne +meson +messy +mesto +metal +meted +meter +metes +metho +meths +metic +metif +metis +metol +metre +metro +meuse +meved +meves +mewed +mewls +meynt +mezes +mezze +mezzo +mhorr +miaou +miaow +miasm +miaul +micas +miche +micht +micks +micky +micos +micra +micro +middy +midge +midgy +midis +midst +miens +mieve +miffs +miffy +mifty +miggs +might +mihas +mihis +miked +mikes +mikra +mikva +milch +milds +miler +miles +milfs +milia +milko +milks +milky +mille +mills +milor +milos +milpa +milts +milty +miltz +mimed +mimeo +mimer +mimes +mimic +mimsy +minae +minar +minas +mince +mincy +minds +mined +miner +mines +minge +mings +mingy +minim +minis +minke +minks +minny +minor +minos +mints +minty +minus +mired +mires +mirex +mirid +mirin +mirks +mirky +mirly +miros +mirth +mirvs +mirza +misch +misdo +miser +mises +misgo +misos +missa +missy +mists +misty +mitch +miter +mites +mitis +mitre +mitts +mixed +mixen +mixer +mixes +mixte +mixup +mizen +mizzy +mneme +moans +moats +mobby +mobes +mobey +mobie +moble +mocha +mochi +mochs +mochy +mocks +modal +model +modem +moder +modes +modge +modii +modus +moers +mofos +moggy +mogul +mohel +mohos +mohrs +mohua +mohur +moile +moils +moira +moire +moist +moits +mojos +mokes +mokis +mokos +molal +molar +molas +molds +moldy +moled +moles +molla +molls +molly +molto +molts +molys +momes +momma +mommy +momus +monad +monal +monas +monde +mondo +moner +money +mongo +mongs +monic +monie +monks +monos +monte +month +monty +moobs +mooch +moods +moody +mooed +mooks +moola +mooli +mools +mooly +moong +moons +moony +moops +moors +moory +moose +moots +moove +moped +moper +mopes +mopey +moppy +mopsy +mopus +morae +moral +moras +morat +moray +morel +mores +moria +morne +morns +moron +morph +morra +morro +morse +morts +mosed +moses +mosey +mosks +mosso +mossy +moste +mosts +moted +motel +moten +motes +motet +motey +moths +mothy +motif +motis +motor +motte +motto +motts +motty +motus +motza +mouch +moues +mould +mouls +moult +mound +mount +moups +mourn +mouse +moust +mousy +mouth +moved +mover +moves +movie +mowas +mowed +mower +mowra +moxas +moxie +moyas +moyle +moyls +mozed +mozes +mozos +mpret +mucho +mucic +mucid +mucin +mucks +mucky +mucor +mucro +mucus +muddy +mudge +mudir +mudra +muffs +mufti +mugga +muggs +muggy +muhly +muids +muils +muirs +muist +mujik +mulch +mulct +muled +mules +muley +mulga +mulie +mulla +mulls +mulse +mulsh +mumms +mummy +mumps +mumsy +mumus +munch +munga +munge +mungo +mungs +munis +munts +muntu +muons +mural +muras +mured +mures +murex +murid +murks +murky +murls +murly +murra +murre +murri +murrs +murry +murti +murva +musar +musca +mused +muser +muses +muset +musha +mushy +music +musit +musks +musky +musos +musse +mussy +musth +musts +musty +mutch +muted +muter +mutes +mutha +mutis +muton +mutts +muxed +muxes +muzak +muzzy +mvule +myall +mylar +mynah +mynas +myoid +myoma +myope +myops +myopy +myrrh +mysid +mythi +myths +mythy +myxos +mzees +naams +naans +nabes +nabis +nabks +nabla +nabob +nache +nacho +nacre +nadas +nadir +naeve +naevi +naffs +nagas +naggy +nagor +nahal +naiad +naifs +naiks +nails +naira +nairu +naive +naked +naker +nakfa +nalas +naled +nalla +named +namer +names +namma +namus +nanas +nance +nancy +nandu +nanna +nanny +nanos +nanua +napas +naped +napes +napoo +nappa +nappe +nappy +naras +narco +narcs +nards +nares +naric +naris +narks +narky +narre +nasal +nashi +nasty +natal +natch +nates +natis +natty +nauch +naunt +naval +navar +navel +naves +navew +navvy +nawab +nazes +nazir +nazis +nduja +neafe +neals +neaps +nears +neath +neats +nebek +nebel +necks +neddy +needs +needy +neeld +neele +neemb +neems +neeps +neese +neeze +negro +negus +neifs +neigh +neist +neive +nelis +nelly +nemas +nemns +nempt +nenes +neons +neper +nepit +neral +nerds +nerdy +nerka +nerks +nerol +nerts +nertz +nerve +nervy +nests +netes +netop +netts +netty +neuks +neume +neums +nevel +never +neves +nevus +newbs +newed +newel +newer +newie +newly +newsy +newts +nexts +nexus +ngaio +ngana +ngati +ngoma +ngwee +nicad +nicer +niche +nicht +nicks +nicol +nidal +nided +nides +nidor +nidus +niece +niefs +nieve +nifes +niffs +niffy +nifty +niger +nighs +night +nihil +nikab +nikah +nikau +nills +nimbi +nimbs +nimps +niner +nines +ninja +ninny +ninon +ninth +nipas +nippy +niqab +nirls +nirly +nisei +nisse +nisus +niter +nites +nitid +niton +nitre +nitro +nitry +nitty +nival +nixed +nixer +nixes +nixie +nizam +nkosi +noahs +nobby +noble +nobly +nocks +nodal +noddy +nodes +nodus +noels +noggs +nohow +noils +noily +noint +noirs +noise +noisy +noles +nolls +nolos +nomad +nomas +nomen +nomes +nomic +nomoi +nomos +nonas +nonce +nones +nonet +nongs +nonis +nonny +nonyl +noobs +nooit +nooks +nooky +noons +noops +noose +nopal +noria +noris +norks +norma +norms +north +nosed +noser +noses +nosey +notal +notch +noted +noter +notes +notum +nould +noule +nouls +nouns +nouny +noups +novae +novas +novel +novum +noway +nowed +nowls +nowts +nowty +noxal +noxes +noyau +noyed +noyes +nubby +nubia +nucha +nuddy +nuder +nudes +nudge +nudie +nudzh +nuffs +nugae +nuked +nukes +nulla +nulls +numbs +numen +nummy +nunny +nurds +nurdy +nurls +nurrs +nurse +nutso +nutsy +nutty +nyaff +nyala +nying +nylon +nymph +nyssa +oaked +oaken +oaker +oakum +oared +oases +oasis +oasts +oaten +oater +oaths +oaves +obang +obeah +obeli +obese +obeys +obias +obied +obiit +obits +objet +oboes +obole +oboli +obols +occam +occur +ocean +ocher +oches +ochre +ochry +ocker +ocrea +octad +octal +octan +octas +octet +octyl +oculi +odahs +odals +odder +oddly +odeon +odeum +odism +odist +odium +odors +odour +odyle +odyls +ofays +offal +offed +offer +offie +oflag +often +ofter +ogams +ogeed +ogees +oggin +ogham +ogive +ogled +ogler +ogles +ogmic +ogres +ohias +ohing +ohmic +ohone +oidia +oiled +oiler +oinks +oints +ojime +okapi +okays +okehs +okras +oktas +olden +older +oldie +oleic +olein +olent +oleos +oleum +olios +olive +ollas +ollav +oller +ollie +ology +olpae +olpes +omasa +omber +ombre +ombus +omega +omens +omers +omits +omlah +omovs +omrah +oncer +onces +oncet +oncus +onely +oners +onery +onion +onium +onkus +onlay +onned +onset +ontic +oobit +oohed +oomph +oonts +ooped +oorie +ooses +ootid +oozed +oozes +opahs +opals +opens +opepe +opera +opine +oping +opium +oppos +opsin +opted +opter +optic +orach +oracy +orals +orang +orant +orate +orbed +orbit +orcas +orcin +order +ordos +oread +orfes +organ +orgia +orgic +orgue +oribi +oriel +orixa +orles +orlon +orlop +ormer +ornis +orpin +orris +ortho +orval +orzos +oscar +oshac +osier +osmic +osmol +ossia +ostia +otaku +otary +other +ottar +otter +ottos +oubit +oucht +ouens +ought +ouija +oulks +oumas +ounce +oundy +oupas +ouped +ouphe +ouphs +ourie +ousel +ousts +outby +outdo +outed +outer +outgo +outre +outro +outta +ouzel +ouzos +ovals +ovary +ovate +ovels +ovens +overs +overt +ovine +ovist +ovoid +ovoli +ovolo +ovule +owche +owies +owing +owled +owler +owlet +owned +owner +owres +owrie +owsen +oxbow +oxers +oxeye +oxide +oxids +oxies +oxime +oxims +oxlip +oxter +oyers +ozeki +ozone +ozzie +paals +paans +pacas +paced +pacer +paces +pacey +pacha +packs +pacos +pacta +pacts +paddy +padis +padle +padma +padre +padri +paean +paedo +paeon +pagan +paged +pager +pages +pagle +pagod +pagri +paiks +pails +pains +paint +paire +pairs +paisa +paise +pakka +palas +palay +palea +paled +paler +pales +palet +palis +palki +palla +palls +pally +palms +palmy +palpi +palps +palsa +palsy +pampa +panax +pance +panda +pands +pandy +paned +panel +panes +panga +pangs +panic +panim +panko +panne +panni +pansy +panto +pants +panty +paoli +paolo +papal +papas +papaw +paper +papes +pappi +pappy +parae +paras +parch +pardi +pards +pardy +pared +paren +pareo +parer +pares +pareu +parev +parge +pargo +paris +parka +parki +parks +parky +parle +parly +parma +parol +parps +parra +parrs +parry +parse +parti +parts +party +parve +parvo +paseo +pases +pasha +pashm +paska +paspy +passe +pasta +paste +pasts +pasty +patch +pated +paten +pater +pates +paths +patin +patio +patka +patly +patsy +patte +patty +patus +pauas +pauls +pause +pavan +paved +paven +paver +paves +pavid +pavin +pavis +pawas +pawaw +pawed +pawer +pawks +pawky +pawls +pawns +paxes +payed +payee +payer +payor +paysd +peace +peach +peage +peags +peaks +peaky +peals +peans +peare +pearl +pears +peart +pease +peats +peaty +peavy +peaze +pebas +pecan +pechs +pecke +pecks +pecky +pedal +pedes +pedis +pedro +peece +peeks +peels +peens +peeoy +peepe +peeps +peers +peery +peeve +peggy +peghs +peins +peise +peize +pekan +pekes +pekin +pekoe +pelas +pelau +peles +pelfs +pells +pelma +pelon +pelta +pelts +penal +pence +pends +pendu +pened +penes +pengo +penie +penis +penks +penna +penne +penni +penny +pents +peons +peony +pepla +pepos +peppy +pepsi +perai +perce +perch +percs +perdu +perdy +perea +peres +peril +peris +perks +perky +perms +perns +perog +perps +perry +perse +perst +perts +perve +pervo +pervs +pervy +pesky +pesos +pesto +pests +pesty +petal +petar +peter +petit +petre +petri +petti +petto +petty +pewee +pewit +peyse +phage +phang +phare +pharm +phase +pheer +phene +pheon +phese +phial +phish +phizz +phlox +phoca +phone +phono +phons +phony +photo +phots +phpht +phuts +phyla +phyle +piani +piano +pians +pibal +pical +picas +piccy +picks +picky +picot +picra +picul +piece +piend +piers +piert +pieta +piets +piety +piezo +piggy +pight +pigmy +piing +pikas +pikau +piked +piker +pikes +pikey +pikis +pikul +pilae +pilaf +pilao +pilar +pilau +pilaw +pilch +pilea +piled +pilei +piler +piles +pilis +pills +pilot +pilow +pilum +pilus +pimas +pimps +pinas +pinch +pined +pines +piney +pingo +pings +pinko +pinks +pinky +pinna +pinny +pinon +pinot +pinta +pinto +pints +pinup +pions +piony +pious +pioye +pioys +pipal +pipas +piped +piper +pipes +pipet +pipis +pipit +pippy +pipul +pique +pirai +pirls +pirns +pirog +pisco +pises +pisky +pisos +pissy +piste +pitas +pitch +piths +pithy +piton +pitot +pitta +piums +pivot +pixel +pixes +pixie +pized +pizes +pizza +plaas +place +plack +plage +plaid +plain +plait +plane +plank +plans +plant +plaps +plash +plasm +plast +plate +plats +platt +platy +playa +plays +plaza +plead +pleas +pleat +plebe +plebs +plena +pleon +plesh +plews +plica +plied +plier +plies +plims +pling +plink +ploat +plods +plong +plonk +plook +plops +plots +plotz +plouk +plows +ploye +ploys +pluck +plues +pluff +plugs +plumb +plume +plump +plums +plumy +plunk +pluot +plush +pluto +plyer +poach +poaka +poake +poboy +pocks +pocky +podal +poddy +podex +podge +podgy +podia +poems +poeps +poesy +poets +pogey +pogge +pogos +pohed +poilu +poind +point +poise +pokal +poked +poker +pokes +pokey +pokie +polar +poled +poler +poles +poley +polio +polis +polje +polka +polks +polls +polly +polos +polts +polyp +polys +pombe +pomes +pommy +pomos +pomps +ponce +poncy +ponds +pones +poney +ponga +pongo +pongs +pongy +ponks +ponts +ponty +ponzu +pooch +poods +pooed +poofs +poofy +poohs +pooja +pooka +pooks +pools +poons +poops +poopy +poori +poort +poots +poove +poovy +popes +poppa +poppy +popsy +porae +poral +porch +pored +porer +pores +porge +porgy +porin +porks +porky +porno +porns +porny +porta +ports +porty +posed +poser +poses +posey +posho +posit +posse +posts +potae +potch +poted +potes +potin +potoo +potsy +potto +potts +potty +pouch +pouff +poufs +pouke +pouks +poule +poulp +poult +pound +poupe +poupt +pours +pouts +pouty +powan +power +powin +pownd +powns +powny +powre +poxed +poxes +poynt +poyou +poyse +pozzy +praam +prads +prahu +prams +prana +prang +prank +praos +prase +prate +prats +pratt +praty +praus +prawn +prays +predy +preed +preen +prees +preif +prems +premy +prent +preon +preop +preps +presa +prese +press +prest +preve +prexy +preys +prial +price +prick +pricy +pride +pried +prief +prier +pries +prigs +prill +prima +prime +primi +primo +primp +prims +primy +prink +print +prion +prior +prise +prism +priss +privy +prize +proas +probe +probs +prods +proem +profs +progs +proin +proke +prole +proll +promo +proms +prone +prong +pronk +proof +props +prore +prose +proso +pross +prost +prosy +proto +proud +proul +prove +prowl +prows +proxy +proyn +prude +prune +prunt +pruta +pryer +pryse +psalm +pseud +pshaw +psion +psoae +psoai +psoas +psora +psych +psyop +pubco +pubes +pubic +pubis +pucan +pucer +puces +pucka +pucks +puddy +pudge +pudgy +pudic +pudor +pudsy +pudus +puers +puffa +puffs +puffy +puggy +pugil +puhas +pujah +pujas +pukas +puked +puker +pukes +pukey +pukka +pukus +pulao +pulas +puled +puler +pules +pulik +pulis +pulka +pulks +pulli +pulls +pully +pulmo +pulps +pulpy +pulse +pulus +pumas +pumie +pumps +punas +punce +punch +punga +pungs +punji +punka +punks +punky +punny +punto +punts +punty +pupae +pupal +pupas +pupil +puppy +pupus +purda +pured +puree +purer +pures +purge +purin +puris +purls +purpy +purrs +purse +pursy +purty +puses +pushy +pusle +pussy +putid +puton +putti +putto +putts +putty +puzel +pwned +pyats +pyets +pygal +pygmy +pyins +pylon +pyned +pynes +pyoid +pyots +pyral +pyran +pyres +pyrex +pyric +pyros +pyxed +pyxes +pyxie +pyxis +pzazz +qadis +qaids +qajaq +qanat +qapik +qibla +qophs +qorma +quack +quads +quaff +quags +quail +quair +quais +quake +quaky +quale +qualm +quant +quare +quark +quart +quash +quasi +quass +quate +quats +quayd +quays +qubit +quean +queen +queer +quell +queme +quena +quern +query +quest +queue +queyn +queys +quich +quick +quids +quiet +quiff +quill +quilt +quims +quina +quine +quino +quins +quint +quipo +quips +quipu +quire +quirk +quirt +quist +quite +quits +quoad +quods +quoif +quoin +quoit +quoll +quonk +quops +quota +quote +quoth +qursh +quyte +rabat +rabbi +rabic +rabid +rabis +raced +racer +races +rache +racks +racon +radar +radge +radii +radio +radix +radon +raffs +rafts +ragas +ragde +raged +ragee +rager +rages +ragga +raggs +raggy +ragis +ragus +rahed +rahui +raias +raids +raiks +raile +rails +raine +rains +rainy +raird +raise +raita +raits +rajah +rajas +rajes +raked +rakee +raker +rakes +rakia +rakis +rakus +rales +rally +ralph +ramal +ramee +ramen +ramet +ramie +ramin +ramis +rammy +ramps +ramus +ranas +rance +ranch +rands +randy +ranee +ranga +range +rangi +rangs +rangy +ranid +ranis +ranke +ranks +rants +raped +raper +rapes +raphe +rapid +rappe +rared +raree +rarer +rares +rarks +rased +raser +rases +rasps +raspy +rasse +rasta +ratal +ratan +ratas +ratch +rated +ratel +rater +rates +ratha +rathe +raths +ratio +ratoo +ratos +ratty +ratus +rauns +raupo +raved +ravel +raven +raver +raves +ravey +ravin +rawer +rawin +rawly +rawns +raxed +raxes +rayah +rayas +rayed +rayle +rayne +rayon +razed +razee +razer +razes +razoo +razor +reach +react +readd +reads +ready +reais +reaks +realm +realo +reals +reame +reams +reamy +reans +reaps +rearm +rears +reast +reata +reate +reave +rebar +rebbe +rebec +rebel +rebid +rebit +rebop +rebus +rebut +rebuy +recal +recap +recce +recco +reccy +recit +recks +recon +recta +recti +recto +recur +recut +redan +redds +reddy +reded +redes +redia +redid +redip +redly +redon +redos +redox +redry +redub +redux +redye +reech +reede +reeds +reedy +reefs +reefy +reeks +reeky +reels +reens +reest +reeve +refed +refel +refer +reffo +refis +refit +refix +refly +refry +regal +regar +reges +reggo +regie +regma +regna +regos +regur +rehab +rehem +reifs +reify +reign +reiki +reiks +reink +reins +reird +reist +reive +rejig +rejon +reked +rekes +rekey +relax +relay +relet +relic +relie +relit +rello +reman +remap +remen +remet +remex +remit +remix +renal +renay +rends +renew +reney +renga +renig +renin +renne +renos +rente +rents +reoil +reorg +repay +repeg +repel +repin +repla +reply +repos +repot +repps +repro +reran +rerig +rerun +resat +resaw +resay +resee +reses +reset +resew +resid +resin +resit +resod +resow +resto +rests +resty +resus +retag +retax +retch +retem +retia +retie +retox +retro +retry +reuse +revel +revet +revie +revue +rewan +rewax +rewed +rewet +rewin +rewon +rewth +rexes +rezes +rheas +rheme +rheum +rhies +rhime +rhine +rhino +rhody +rhomb +rhone +rhumb +rhyme +rhyne +rhyta +riads +rials +riant +riata +ribas +ribby +ribes +riced +ricer +rices +ricey +richt +ricin +ricks +rider +rides +ridge +ridgy +ridic +riels +riems +rieve +rifer +riffs +rifle +rifte +rifts +rifty +riggs +right +rigid +rigol +rigor +riled +riles +riley +rille +rills +rimae +rimed +rimer +rimes +rimus +rinds +rindy +rines +rings +rinks +rinse +rioja +riots +riped +ripen +riper +ripes +ripps +risen +riser +rises +rishi +risks +risky +risps +risus +rites +ritts +ritzy +rival +rivas +rived +rivel +riven +river +rives +rivet +riyal +rizas +roach +roads +roams +roans +roars +roary +roast +roate +robed +robes +robin +roble +robot +rocks +rocky +roded +rodeo +rodes +roger +rogue +roguy +rohes +roids +roils +roily +roins +roist +rojak +rojis +roked +roker +rokes +rolag +roles +rolfs +rolls +romal +roman +romeo +romps +ronde +rondo +roneo +rones +ronin +ronne +ronte +ronts +roods +roofs +roofy +rooks +rooky +rooms +roomy +roons +roops +roopy +roosa +roose +roost +roots +rooty +roped +roper +ropes +ropey +roque +roral +rores +roric +rorid +rorie +rorts +rorty +rosed +roses +roset +roshi +rosin +rosit +rosti +rosts +rotal +rotan +rotas +rotch +roted +rotes +rotis +rotls +roton +rotor +rotos +rotte +rouen +roues +rouge +rough +roule +rouls +roums +round +roups +roupy +rouse +roust +route +routh +routs +roved +roven +rover +roves +rowan +rowdy +rowed +rowel +rowen +rower +rowie +rowme +rownd +rowth +rowts +royal +royne +royst +rozet +rozit +ruana +rubai +rubby +rubel +rubes +rubin +ruble +rubli +rubus +ruche +rucks +rudas +rudds +ruddy +ruder +rudes +rudie +rudis +rueda +ruers +ruffe +ruffs +rugae +rugal +rugby +ruggy +ruing +ruins +rukhs +ruled +ruler +rules +rumal +rumba +rumbo +rumen +rumes +rumly +rummy +rumor +rumpo +rumps +rumpy +runch +runds +runed +runes +rungs +runic +runny +runts +runty +rupee +rupia +rural +rurps +rurus +rusas +ruses +rushy +rusks +rusma +russe +rusts +rusty +ruths +rutin +rutty +ryals +rybat +ryked +rykes +rymme +rynds +ryots +ryper +saags +sabal +sabed +saber +sabes +sabha +sabin +sabir +sable +sabot +sabra +sabre +sacks +sacra +saddo +sades +sadhe +sadhu +sadis +sadly +sados +sadza +safed +safer +safes +sagas +sager +sages +saggy +sagos +sagum +saheb +sahib +saice +saick +saics +saids +saiga +sails +saims +saine +sains +saint +sairs +saist +saith +sajou +sakai +saker +sakes +sakia +sakis +sakti +salad +salal +salat +salep +sales +salet +salic +salix +salle +sally +salmi +salol +salon +salop +salpa +salps +salsa +salse +salto +salts +salty +salue +salut +salve +salvo +saman +samas +samba +sambo +samek +samel +samen +sames +samey +samfu +sammy +sampi +samps +sands +sandy +saned +saner +sanes +sanga +sangh +sango +sangs +sanko +sansa +santo +sants +saola +sapan +sapid +sapor +sappy +saran +sards +sared +saree +sarge +sargo +sarin +saris +sarks +sarky +sarod +saros +sarus +saser +sasin +sasse +sassy +satai +satay +sated +satem +sates +satin +satis +satyr +sauba +sauce +sauch +saucy +saugh +sauls +sault +sauna +saunt +saury +saute +sauts +saved +saver +saves +savey +savin +savor +savoy +savvy +sawah +sawed +sawer +saxes +sayed +sayer +sayid +sayne +sayon +sayst +sazes +scabs +scads +scaff +scags +scail +scala +scald +scale +scall +scalp +scaly +scamp +scams +scand +scans +scant +scapa +scape +scapi +scare +scarf +scarp +scars +scart +scary +scath +scats +scatt +scaud +scaup +scaur +scaws +sceat +scena +scend +scene +scent +schav +schmo +schul +schwa +scion +sclim +scody +scoff +scogs +scold +scone +scoog +scoop +scoot +scopa +scope +scops +score +scorn +scots +scoug +scoup +scour +scout +scowl +scowp +scows +scrab +scrae +scrag +scram +scran +scrap +scrat +scraw +scray +scree +screw +scrim +scrip +scrob +scrod +scrog +scrow +scrub +scrum +scuba +scudi +scudo +scuds +scuff +scuft +scugs +sculk +scull +sculp +sculs +scums +scups +scurf +scurs +scuse +scuta +scute +scuts +scuzz +scyes +sdayn +sdein +seals +seame +seams +seamy +seans +seare +sears +sease +seats +seaze +sebum +secco +sechs +sects +sedan +seder +sedes +sedge +sedgy +sedum +seeds +seedy +seeks +seeld +seels +seely +seems +seeps +seepy +seers +sefer +segar +segni +segno +segol +segos +segue +sehri +seifs +seils +seine +seirs +seise +seism +seity +seiza +seize +sekos +sekts +selah +seles +selfs +sella +selle +sells +selva +semee +semen +semes +semie +semis +senas +sends +senes +sengi +senna +senor +sensa +sense +sensi +sente +senti +sents +senvy +senza +sepad +sepal +sepia +sepic +sepoy +septa +septs +serac +serai +seral +sered +serer +seres +serfs +serge +seric +serif +serin +serks +seron +serow +serra +serre +serrs +serry +serum +serve +servo +sesey +sessa +setae +setal +seton +setts +setup +seven +sever +sewan +sewar +sewed +sewel +sewen +sewer +sewin +sexed +sexer +sexes +sexto +sexts +seyen +shack +shade +shads +shady +shaft +shags +shahs +shake +shako +shakt +shaky +shale +shall +shalm +shalt +shaly +shama +shame +shams +shand +shank +shans +shape +shaps +shard +share +shark +sharn +sharp +shash +shaul +shave +shawl +shawm +shawn +shaws +shaya +shays +shchi +sheaf +sheal +shear +sheas +sheds +sheel +sheen +sheep +sheer +sheet +sheik +shelf +shell +shend +shent +sheol +sherd +shere +shero +shets +sheva +shewn +shews +shiai +shied +shiel +shier +shies +shift +shill +shily +shims +shine +shins +shiny +ships +shire +shirk +shirr +shirs +shirt +shish +shiso +shist +shite +shits +shiur +shiva +shive +shivs +shlep +shlub +shmek +shmoe +shoal +shoat +shock +shoed +shoer +shoes +shogi +shogs +shoji +shojo +shola +shone +shook +shool +shoon +shoos +shoot +shope +shops +shore +shorl +shorn +short +shote +shots +shott +shout +shove +showd +shown +shows +showy +shoyu +shred +shrew +shris +shrow +shrub +shrug +shtik +shtum +shtup +shuck +shule +shuln +shuls +shuns +shunt +shura +shush +shute +shuts +shwas +shyer +shyly +sials +sibbs +sibyl +sices +sicht +sicko +sicks +sicky +sidas +sided +sider +sides +sidha +sidhe +sidle +siege +sield +siens +sient +sieth +sieur +sieve +sifts +sighs +sight +sigil +sigla +sigma +signa +signs +sijos +sikas +siker +sikes +silds +siled +silen +siler +siles +silex +silks +silky +sills +silly +silos +silts +silty +silva +simar +simas +simba +simis +simps +simul +since +sinds +sined +sines +sinew +singe +sings +sinhs +sinks +sinky +sinus +siped +sipes +sippy +sired +siree +siren +sires +sirih +siris +siroc +sirra +sirup +sisal +sises +sissy +sista +sists +sitar +sited +sites +sithe +sitka +situp +situs +siver +sixer +sixes +sixmo +sixte +sixth +sixty +sizar +sized +sizel +sizer +sizes +skags +skail +skald +skank +skart +skate +skats +skatt +skaws +skean +skear +skeds +skeed +skeef +skeen +skeer +skees +skeet +skegg +skegs +skein +skelf +skell +skelm +skelp +skene +skens +skeos +skeps +skers +skets +skews +skids +skied +skier +skies +skiey +skiff +skill +skimo +skimp +skims +skink +skins +skint +skios +skips +skirl +skirr +skirt +skite +skits +skive +skivy +sklim +skoal +skody +skoff +skogs +skols +skool +skort +skosh +skran +skrik +skuas +skugs +skulk +skull +skunk +skyed +skyer +skyey +skyfs +skyre +skyrs +skyte +slabs +slack +slade +slaes +slags +slaid +slain +slake +slams +slane +slang +slank +slant +slaps +slart +slash +slate +slats +slaty +slave +slaws +slays +slebs +sleds +sleek +sleep +sleer +sleet +slept +slews +sleys +slice +slick +slide +slier +slily +slime +slims +slimy +sling +slink +slipe +slips +slipt +slish +slits +slive +sloan +slobs +sloes +slogs +sloid +slojd +slomo +sloom +sloop +sloot +slope +slops +slopy +slorm +slosh +sloth +slots +slove +slows +sloyd +slubb +slubs +slued +slues +sluff +slugs +sluit +slump +slums +slung +slunk +slurb +slurp +slurs +sluse +slush +sluts +slyer +slyly +slype +smaak +smack +smaik +small +smalm +smalt +smarm +smart +smash +smaze +smear +smeek +smees +smeik +smeke +smell +smelt +smerk +smews +smile +smirk +smirr +smirs +smite +smith +smits +smock +smogs +smoke +smoko +smoky +smolt +smoor +smoot +smore +smorg +smote +smout +smowt +smugs +smurs +smush +smuts +snabs +snack +snafu +snags +snail +snake +snaky +snaps +snare +snarf +snark +snarl +snars +snary +snash +snath +snaws +snead +sneak +sneap +snebs +sneck +sneds +sneed +sneer +snees +snell +snibs +snick +snide +snies +sniff +snift +snigs +snipe +snips +snipy +snirt +snits +snobs +snods +snoek +snoep +snogs +snoke +snood +snook +snool +snoop +snoot +snore +snort +snots +snout +snowk +snows +snowy +snubs +snuck +snuff +snugs +snush +snyes +soaks +soaps +soapy +soare +soars +soave +sobas +sober +socas +soces +socko +socks +socle +sodas +soddy +sodic +sodom +sofar +sofas +softa +softs +softy +soger +soggy +sohur +soils +soily +sojas +sojus +sokah +soken +sokes +sokol +solah +solan +solar +solas +solde +soldi +soldo +solds +soled +solei +soler +soles +solid +solon +solos +solum +solus +solve +soman +somas +sonar +sonce +sonde +sones +songs +sonic +sonly +sonne +sonny +sonse +sonsy +sooey +sooks +sooky +soole +sools +sooms +soops +soote +sooth +soots +sooty +sophs +sophy +sopor +soppy +sopra +soral +soras +sorbo +sorbs +sorda +sordo +sords +sored +soree +sorel +sorer +sores +sorex +sorgo +sorns +sorra +sorry +sorta +sorts +sorus +soths +sotol +souce +souct +sough +souks +souls +soums +sound +soups +soupy +sours +souse +south +souts +sowar +sowce +sowed +sower +sowff +sowfs +sowle +sowls +sowms +sownd +sowne +sowps +sowse +sowth +soyas +soyle +soyuz +sozin +space +spacy +spade +spado +spaed +spaer +spaes +spags +spahi +spail +spain +spait +spake +spald +spale +spall +spalt +spams +spane +spang +spank +spans +spard +spare +spark +spars +spart +spasm +spate +spats +spaul +spawl +spawn +spaws +spayd +spays +spaza +spazz +speak +speal +spean +spear +speat +speck +specs +spect +speed +speel +speer +speil +speir +speks +speld +spelk +spell +spelt +spend +spent +speos +sperm +spets +speug +spews +spewy +spial +spica +spice +spick +spics +spicy +spide +spied +spiel +spier +spies +spiff +spifs +spike +spiks +spiky +spile +spill +spilt +spims +spina +spine +spink +spins +spiny +spire +spirt +spiry +spite +spits +spitz +spivs +splat +splay +split +splog +spode +spods +spoil +spoke +spoof +spook +spool +spoom +spoon +spoor +spoot +spore +spork +sport +sposh +spots +spout +sprad +sprag +sprat +spray +spred +spree +sprew +sprig +sprit +sprod +sprog +sprue +sprug +spuds +spued +spuer +spues +spugs +spule +spume +spumy +spunk +spurn +spurs +spurt +sputa +spyal +spyre +squab +squad +squat +squaw +squeg +squib +squid +squit +squiz +stabs +stack +stade +staff +stage +stags +stagy +staid +staig +stain +stair +stake +stale +stalk +stall +stamp +stand +stane +stang +stank +staph +staps +stare +stark +starn +starr +stars +start +stash +state +stats +staun +stave +staws +stays +stead +steak +steal +steam +stean +stear +stedd +stede +steds +steed +steek +steel +steem +steen +steep +steer +steil +stein +stela +stele +stell +steme +stems +stend +steno +stens +stent +steps +stept +stere +stern +stets +stews +stewy +steys +stich +stick +stied +sties +stiff +stilb +stile +still +stilt +stime +stims +stimy +sting +stink +stint +stipa +stipe +stire +stirk +stirp +stirs +stive +stivy +stoae +stoai +stoas +stoat +stobs +stock +stoep +stogy +stoic +stoit +stoke +stole +stoln +stoma +stomp +stond +stone +stong +stonk +stonn +stony +stood +stook +stool +stoop +stoor +stope +stops +stopt +store +stork +storm +story +stoss +stots +stott +stoun +stoup +stour +stout +stove +stown +stowp +stows +strad +strae +strag +strak +strap +straw +stray +strep +strew +stria +strig +strim +strip +strop +strow +stroy +strum +strut +stubs +stuck +stude +studs +study +stuff +stull +stulm +stumm +stump +stums +stung +stunk +stuns +stunt +stupa +stupe +sture +sturt +styed +styes +style +styli +stylo +styme +stymy +styre +styte +suave +subah +subas +subby +suber +subha +succi +sucks +sucky +sucre +sudds +sudor +sudsy +suede +suent +suers +suete +suets +suety +sugan +sugar +sughs +sugos +suhur +suids +suing +suint +suite +suits +sujee +sukhs +sukuk +sulci +sulfa +sulfo +sulks +sulky +sully +sulph +sulus +sumac +sumis +summa +sumos +sumph +sumps +sunis +sunks +sunna +sunns +sunny +sunup +super +supes +supra +surah +sural +suras +surat +surds +sured +surer +sures +surfs +surfy +surge +surgy +surly +surra +sused +suses +sushi +susus +sutor +sutra +sutta +swabs +swack +swads +swage +swags +swail +swain +swale +swaly +swami +swamp +swamy +swang +swank +swans +swaps +swapt +sward +sware +swarf +swarm +swart +swash +swath +swats +swayl +sways +sweal +swear +sweat +swede +sweed +sweel +sweep +sweer +swees +sweet +sweir +swell +swelt +swept +swerf +sweys +swies +swift +swigs +swile +swill +swims +swine +swing +swink +swipe +swire +swirl +swish +swiss +swith +swits +swive +swizz +swobs +swole +swoln +swoon +swoop +swops +swopt +sword +swore +sworn +swots +swoun +swung +sybbe +sybil +syboe +sybow +sycee +syces +sycon +syens +syker +sykes +sylis +sylph +sylva +symar +synch +syncs +synds +syned +synes +synod +synth +syped +sypes +syphs +syrah +syren +syrup +sysop +sythe +syver +taals +taata +tabby +taber +tabes +tabid +tabis +tabla +table +taboo +tabor +tabun +tabus +tacan +taces +tacet +tache +tacho +tachs +tacit +tacks +tacky +tacos +tacts +taels +taffy +tafia +taggy +tagma +tahas +tahrs +taiga +taigs +taiko +tails +tains +taint +taira +taish +taits +tajes +takas +taken +taker +takes +takhi +takin +takis +takky +talak +talaq +talar +talas +talcs +talcy +talea +taler +tales +talks +talky +talls +tally +talma +talon +talpa +taluk +talus +tamal +tamed +tamer +tames +tamin +tamis +tammy +tamps +tanas +tanga +tangi +tango +tangs +tangy +tanhs +tanka +tanks +tanky +tanna +tansy +tanti +tanto +tanty +tapas +taped +tapen +taper +tapes +tapet +tapir +tapis +tappa +tapus +taras +tardo +tardy +tared +tares +targa +targe +tarns +taroc +tarok +taros +tarot +tarps +tarre +tarry +tarsi +tarts +tarty +tasar +tased +taser +tases +tasks +tassa +tasse +tasso +taste +tasty +tatar +tater +tates +taths +tatie +tatou +tatts +tatty +tatus +taube +tauld +taunt +tauon +taupe +tauts +tavah +tavas +taver +tawai +tawas +tawed +tawer +tawie +tawny +tawse +tawts +taxed +taxer +taxes +taxis +taxol +taxon +taxor +taxus +tayra +tazza +tazze +teach +teade +teads +teaed +teaks +teals +teams +tears +teary +tease +teats +teaze +techs +techy +tecta +teddy +teels +teems +teend +teene +teens +teeny +teers +teeth +teffs +teggs +tegua +tegus +tehrs +teiid +teils +teind +teins +telae +telco +teles +telex +telia +telic +tells +telly +teloi +telos +temed +temes +tempi +tempo +temps +tempt +temse +tench +tends +tendu +tenes +tenet +tenge +tenia +tenne +tenno +tenny +tenon +tenor +tense +tenth +tents +tenty +tenue +tepal +tepas +tepee +tepid +tepoy +terai +teras +terce +terek +teres +terfe +terfs +terga +terms +terne +terns +terra +terry +terse +terts +tesla +testa +teste +tests +testy +tetes +teths +tetra +tetri +teuch +teugh +tewed +tewel +tewit +texas +texes +texts +thack +thagi +thaim +thale +thali +thana +thane +thang +thank +thans +thanx +tharm +thars +thaws +thawy +thebe +theca +theed +theek +thees +theft +thegn +theic +thein +their +thelf +thema +theme +thens +theow +there +therm +these +thesp +theta +thete +thews +thewy +thick +thief +thigh +thigs +thilk +thill +thine +thing +think +thins +thiol +third +thirl +thoft +thole +tholi +thong +thorn +thoro +thorp +those +thous +thowl +thrae +thraw +three +threw +thrid +thrip +throb +throe +throw +thrum +thuds +thugs +thuja +thumb +thump +thunk +thurl +thuya +thyme +thymi +thymy +tians +tiara +tiars +tibia +tical +ticca +ticed +tices +tichy +ticks +ticky +tidal +tiddy +tided +tides +tiers +tiffs +tifos +tifts +tiger +tiges +tight +tigon +tikas +tikes +tikis +tikka +tilak +tilde +tiled +tiler +tiles +tills +tilly +tilth +tilts +timbo +timed +timer +times +timid +timon +timps +tinas +tinct +tinds +tinea +tined +tines +tinge +tings +tinks +tinny +tints +tinty +tipis +tippy +tipsy +tired +tires +tirls +tiros +tirrs +titan +titch +titer +tithe +titis +title +titre +titty +titup +tiyin +tiyns +tizes +tizzy +toads +toady +toast +toaze +tocks +tocky +tocos +today +todde +toddy +toeas +toffs +toffy +tofts +tofus +togae +togas +toged +toges +togue +tohos +toile +toils +toing +toise +toits +tokay +toked +token +toker +tokes +tokos +tolan +tolar +tolas +toled +toles +tolls +tolly +tolts +tolus +tolyl +toman +tombs +tomes +tomia +tommy +tomos +tonal +tondi +tondo +toned +toner +tones +toney +tonga +tongs +tonic +tonka +tonks +tonne +tonus +tools +tooms +toons +tooth +toots +topaz +toped +topee +topek +toper +topes +tophe +tophi +tophs +topic +topis +topoi +topos +toppy +toque +torah +toran +toras +torch +torcs +tores +toric +torii +toros +torot +torrs +torse +torsi +torsk +torso +torta +torte +torts +torus +tosas +tosed +toses +toshy +tossy +total +toted +totem +toter +totes +totty +touch +tough +touks +touns +tours +touse +tousy +touts +touze +touzy +towed +towel +tower +towie +towns +towny +towse +towsy +towts +towze +towzy +toxic +toxin +toyed +toyer +toyon +toyos +tozed +tozes +tozie +trabs +trace +track +tract +trade +trads +tragi +traik +trail +train +trait +tramp +trams +trank +tranq +trans +trant +trape +traps +trapt +trash +trass +trats +tratt +trave +trawl +trayf +trays +tread +treat +treck +treed +treen +trees +trefa +treif +treks +trema +trems +trend +tress +trest +trets +trews +treyf +treys +triac +triad +trial +tribe +trice +trick +tride +tried +trier +tries +triff +trigo +trigs +trike +trild +trill +trims +trine +trins +triol +trior +trios +tripe +trips +tripy +trist +trite +troad +troak +troat +trock +trode +trods +trogs +trois +troke +troll +tromp +trona +tronc +trone +tronk +trons +troop +trooz +trope +troth +trots +trout +trove +trows +troys +truce +truck +trued +truer +trues +trugo +trugs +trull +truly +trump +trunk +truss +trust +truth +tryer +tryke +tryma +tryps +tryst +tsade +tsadi +tsars +tsked +tsuba +tsubo +tuans +tuart +tuath +tubae +tubal +tubar +tubas +tubby +tubed +tuber +tubes +tucks +tufas +tuffe +tuffs +tufts +tufty +tugra +tuile +tuina +tuism +tuktu +tules +tulip +tulle +tulpa +tulsi +tumid +tummy +tumor +tumps +tumpy +tunas +tunds +tuned +tuner +tunes +tungs +tunic +tunny +tupek +tupik +tuple +tuque +turbo +turds +turfs +turfy +turks +turme +turms +turns +turnt +turps +turrs +tushy +tusks +tusky +tutee +tutor +tutti +tutty +tutus +tuxes +tuyer +twaes +twain +twals +twang +twank +twats +tways +tweak +tweed +tweel +tween +tweep +tweer +tweet +twerk +twerp +twice +twier +twigs +twill +twilt +twine +twink +twins +twiny +twire +twirl +twirp +twist +twite +twits +twixt +twoer +twyer +tyees +tyers +tying +tyiyn +tykes +tyler +tymps +tynde +tyned +tynes +typal +typed +types +typey +typic +typos +typps +typto +tyran +tyred +tyres +tyros +tythe +tzars +udals +udder +udons +ugali +ugged +uhlan +uhuru +ukase +ulama +ulans +ulcer +ulema +ulmin +ulnad +ulnae +ulnar +ulnas +ulpan +ultra +ulvas +ulyie +ulzie +umami +umbel +umber +umble +umbos +umbra +umbre +umiac +umiak +umiaq +ummah +ummas +ummed +umped +umphs +umpie +umpty +umrah +umras +unais +unapt +unarm +unary +unaus +unbag +unban +unbar +unbed +unbid +unbox +uncap +unces +uncia +uncle +uncos +uncoy +uncus +uncut +undam +undee +under +undid +undos +undue +undug +uneth +unfed +unfit +unfix +ungag +unget +ungod +ungot +ungum +unhat +unhip +unica +unify +union +unite +units +unity +unjam +unked +unket +unkid +unlaw +unlay +unled +unlet +unlid +unlit +unman +unmet +unmew +unmix +unpay +unpeg +unpen +unpin +unred +unrid +unrig +unrip +unsaw +unsay +unsee +unset +unsew +unsex +unsod +untax +untie +until +untin +unwed +unwet +unwit +unwon +unzip +upbow +upbye +updos +updry +upend +upjet +uplay +upled +uplit +upped +upper +upran +uprun +upsee +upset +upsey +uptak +upter +uptie +uraei +urali +uraos +urare +urari +urase +urate +urban +urbex +urbia +urdee +ureal +ureas +uredo +ureic +urena +urent +urged +urger +urges +urial +urine +urite +urman +urnal +urned +urped +ursae +ursid +urson +urubu +urvas +usage +users +usher +using +usnea +usque +usual +usure +usurp +usury +uteri +utile +utter +uveal +uveas +uvula +vacua +vaded +vades +vagal +vague +vagus +vails +vaire +vairs +vairy +vakas +vakil +vales +valet +valid +valis +valor +valse +value +valve +vamps +vampy +vanda +vaned +vanes +vangs +vants +vaped +vaper +vapes +vapid +vapor +varan +varas +vardy +varec +vares +varia +varix +varna +varus +varve +vasal +vases +vasts +vasty +vatic +vatus +vauch +vault +vaunt +vaute +vauts +vawte +vaxes +veale +veals +vealy +veena +veeps +veers +veery +vegan +vegas +veges +vegie +vegos +vehme +veils +veily +veins +veiny +velar +velds +veldt +veles +vells +velum +venae +venal +vends +vendu +veney +venge +venin +venom +vents +venue +venus +verbs +verge +verra +verry +verse +verso +verst +verts +vertu +verve +vespa +vesta +vests +vetch +vexed +vexer +vexes +vexil +vezir +vials +viand +vibes +vibex +vibey +vicar +viced +vices +vichy +video +viers +views +viewy +vifda +viffs +vigas +vigia +vigil +vigor +vilde +viler +villa +villi +vills +vimen +vinal +vinas +vinca +vined +viner +vines +vinew +vinic +vinos +vints +vinyl +viola +viold +viols +viper +viral +vired +vireo +vires +virga +virge +virid +virls +virtu +virus +visas +vised +vises +visie +visit +visne +vison +visor +vista +visto +vitae +vital +vitas +vitex +vitro +vitta +vivas +vivat +vivda +viver +vives +vivid +vixen +vizir +vizor +vleis +vlies +vlogs +voars +vocab +vocal +voces +voddy +vodka +vodou +vodun +voema +vogie +vogue +voice +voids +voila +voile +voips +volae +volar +voled +voles +volet +volks +volta +volte +volti +volts +volva +volve +vomer +vomit +voted +voter +votes +vouch +vouge +voulu +vowed +vowel +vower +voxel +vozhd +vraic +vrils +vroom +vrous +vrouw +vrows +vuggs +vuggy +vughs +vughy +vulgo +vulns +vulva +vutty +vying +waacs +wacke +wacko +wacks +wacky +wadds +waddy +waded +wader +wades +wadge +wadis +wadts +wafer +waffs +wafts +waged +wager +wages +wagga +wagon +wagyu +wahoo +waide +waifs +waift +wails +wains +wairs +waist +waite +waits +waive +wakas +waked +waken +waker +wakes +wakfs +waldo +walds +waled +waler +wales +walie +walis +walks +walla +walls +wally +walty +waltz +wamed +wames +wamus +wands +waned +wanes +waney +wangs +wanks +wanky +wanle +wanly +wanna +wants +wanty +wanze +waqfs +warbs +warby +wards +wared +wares +warez +warks +warms +warns +warps +warre +warst +warts +warty +wases +washy +wasms +wasps +waspy +waste +wasts +watap +watch +water +watts +wauff +waugh +wauks +waulk +wauls +waurs +waved +waver +waves +wavey +wawas +wawes +wawls +waxed +waxen +waxer +waxes +wayed +wazir +wazoo +weald +weals +weamb +weans +wears +weary +weave +webby +weber +wecht +wedel +wedge +wedgy +weeds +weedy +weeke +weeks +weels +weems +weens +weeny +weeps +weepy +weest +weete +weets +wefte +wefts +weids +weigh +weils +weird +weirs +weise +weize +wekas +welch +welds +welke +welks +welkt +wells +welly +welsh +welts +wembs +wench +wends +wenge +wenny +wents +weros +wersh +wests +wetas +wetly +wexed +wexes +whack +whale +whamo +whams +whang +whaps +whare +wharf +whata +whats +whaup +whaur +wheal +whear +wheat +wheel +wheen +wheep +wheft +whelk +whelm +whelp +whens +where +whets +whews +wheys +which +whids +whiff +whift +whigs +while +whilk +whims +whine +whins +whiny +whios +whips +whipt +whirl +whirr +whirs +whish +whisk +whiss +whist +white +whits +whity +whizz +whole +whomp +whoof +whoop +whoot +whops +whore +whorl +whort +whose +whoso +whows +whump +whups +whyda +wicca +wicks +wicky +widdy +widen +wider +wides +widow +width +wield +wiels +wifed +wifes +wifey +wifie +wifty +wigan +wigga +wiggy +wight +wikis +wilco +wilds +wiled +wiles +wilga +wilis +wilja +wills +willy +wilts +wimps +wimpy +wince +winch +winds +windy +wined +wines +winey +winge +wings +wingy +winks +winna +winns +winos +winze +wiped +wiper +wipes +wired +wirer +wires +wirra +wised +wiser +wises +wisha +wisht +wisps +wispy +wists +witan +witch +wited +wites +withe +withs +withy +witty +wived +wiver +wives +wizen +wizes +woads +woald +wocks +wodge +woful +wojus +woken +woker +wokka +wolds +wolfs +wolly +wolve +woman +wombs +womby +women +womyn +wonga +wongi +wonks +wonky +wonts +woods +woody +wooed +wooer +woofs +woofy +woold +wools +wooly +woons +woops +woopy +woose +woosh +wootz +woozy +words +wordy +works +world +worms +wormy +worry +worse +worst +worth +worts +would +wound +woven +wowed +wowee +woxen +wrack +wrang +wraps +wrapt +wrast +wrate +wrath +wrawl +wreak +wreck +wrens +wrest +wrick +wried +wrier +wries +wring +wrist +write +writs +wroke +wrong +wroot +wrote +wroth +wrung +wryer +wryly +wuddy +wudus +wulls +wurst +wuses +wushu +wussy +wuxia +wyled +wyles +wynds +wynns +wyted +wytes +xebec +xenia +xenic +xenon +xeric +xerox +xerus +xoana +xrays +xylan +xylem +xylic +xylol +xylyl +xysti +xysts +yaars +yabas +yabba +yabby +yacca +yacht +yacka +yacks +yaffs +yager +yages +yagis +yahoo +yaird +yakka +yakow +yales +yamen +yampy +yamun +yangs +yanks +yapok +yapon +yapps +yappy +yarak +yarco +yards +yarer +yarfa +yarks +yarns +yarrs +yarta +yarto +yates +yauds +yauld +yaups +yawed +yawey +yawls +yawns +yawny +yawps +ybore +yclad +ycled +ycond +ydrad +ydred +yeads +yeahs +yealm +yeans +yeard +yearn +years +yeast +yecch +yechs +yechy +yedes +yeeds +yeesh +yeggs +yelks +yells +yelms +yelps +yelts +yenta +yente +yerba +yerds +yerks +yeses +yesks +yests +yesty +yetis +yetts +yeuks +yeuky +yeven +yeves +yewen +yexed +yexes +yfere +yield +yiked +yikes +yills +yince +yipes +yippy +yirds +yirks +yirrs +yirth +yites +yitie +ylems +ylike +ylkes +ymolt +ympes +yobbo +yobby +yocks +yodel +yodhs +yodle +yogas +yogee +yoghs +yogic +yogin +yogis +yoick +yojan +yoked +yokel +yoker +yokes +yokul +yolks +yolky +yomim +yomps +yonic +yonis +yonks +yoofs +yoops +yores +yorks +yorps +youks +young +yourn +yours +yourt +youse +youth +yowed +yowes +yowie +yowls +yowza +yrapt +yrent +yrivd +yrneh +ysame +ytost +yuans +yucas +yucca +yucch +yucko +yucks +yucky +yufts +yugas +yuked +yukes +yukky +yukos +yulan +yules +yummo +yummy +yumps +yupon +yuppy +yurta +yurts +yuzus +zabra +zacks +zaida +zaidy +zaire +zakat +zaman +zambo +zamia +zanja +zante +zanza +zanze +zappy +zarfs +zaris +zatis +zaxes +zayin +zazen +zeals +zebec +zebra +zebub +zebus +zedas +zeins +zendo +zerda +zerks +zeros +zests +zesty +zetas +zexes +zezes +zhomo +zibet +ziffs +zigan +zilas +zilch +zilla +zills +zimbi +zimbs +zinco +zincs +zincy +zineb +zines +zings +zingy +zinke +zinky +zippo +zippy +ziram +zitis +zizel +zizit +zlote +zloty +zoaea +zobos +zobus +zocco +zoeae +zoeal +zoeas +zoism +zoist +zombi +zonae +zonal +zonda +zoned +zoner +zones +zonks +zooea +zooey +zooid +zooks +zooms +zoons +zooty +zoppa +zoppo +zoril +zoris +zorro +zouks +zowee +zowie +zulus +zupan +zupas +zuppa +zurfs +zuzim +zygal +zygon +zymes +zymic \ No newline at end of file diff --git a/gym_wordle/dictionary/guess_list.npy b/gym_wordle/dictionary/guess_list.npy new file mode 100644 index 0000000000000000000000000000000000000000..c23501378db815c9b1bb4c5493bc014afe54ad17 GIT binary patch literal 519008 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 J-sSk`-hb8)36lT- literal 0 HcmV?d00001 diff --git a/gym_wordle/dictionary/solution_list.csv b/gym_wordle/dictionary/solution_list.csv new file mode 100644 index 0000000..821a934 --- /dev/null +++ b/gym_wordle/dictionary/solution_list.csv @@ -0,0 +1,2315 @@ +aback +abase +abate +abbey +abbot +abhor +abide +abled +abode +abort +about +above +abuse +abyss +acorn +acrid +actor +acute +adage +adapt +adept +admin +admit +adobe +adopt +adore +adorn +adult +affix +afire +afoot +afoul +after +again +agape +agate +agent +agile +aging +aglow +agony +agora +agree +ahead +aider +aisle +alarm +album +alert +algae +alibi +alien +align +alike +alive +allay +alley +allot +allow +alloy +aloft +alone +along +aloof +aloud +alpha +altar +alter +amass +amaze +amber +amble +amend +amiss +amity +among +ample +amply +amuse +angel +anger +angle +angry +angst +anime +ankle +annex +annoy +annul +anode +antic +anvil +aorta +apart +aphid +aping +apnea +apple +apply +apron +aptly +arbor +ardor +arena +argue +arise +armor +aroma +arose +array +arrow +arson +artsy +ascot +ashen +aside +askew +assay +asset +atoll +atone +attic +audio +audit +augur +aunty +avail +avert +avian +avoid +await +awake +award +aware +awash +awful +awoke +axial +axiom +axion +azure +bacon +badge +badly +bagel +baggy +baker +baler +balmy +banal +banjo +barge +baron +basal +basic +basil +basin +basis +baste +batch +bathe +baton +batty +bawdy +bayou +beach +beady +beard +beast +beech +beefy +befit +began +begat +beget +begin +begun +being +belch +belie +belle +belly +below +bench +beret +berry +berth +beset +betel +bevel +bezel +bible +bicep +biddy +bigot +bilge +billy +binge +bingo +biome +birch +birth +bison +bitty +black +blade +blame +bland +blank +blare +blast +blaze +bleak +bleat +bleed +bleep +blend +bless +blimp +blind +blink +bliss +blitz +bloat +block +bloke +blond +blood +bloom +blown +bluer +bluff +blunt +blurb +blurt +blush +board +boast +bobby +boney +bongo +bonus +booby +boost +booth +booty +booze +boozy +borax +borne +bosom +bossy +botch +bough +boule +bound +bowel +boxer +brace +braid +brain +brake +brand +brash +brass +brave +bravo +brawl +brawn +bread +break +breed +briar +bribe +brick +bride +brief +brine +bring +brink +briny +brisk +broad +broil +broke +brood +brook +broom +broth +brown +brunt +brush +brute +buddy +budge +buggy +bugle +build +built +bulge +bulky +bully +bunch +bunny +burly +burnt +burst +bused +bushy +butch +butte +buxom +buyer +bylaw +cabal +cabby +cabin +cable +cacao +cache +cacti +caddy +cadet +cagey +cairn +camel +cameo +canal +candy +canny +canoe +canon +caper +caput +carat +cargo +carol +carry +carve +caste +catch +cater +catty +caulk +cause +cavil +cease +cedar +cello +chafe +chaff +chain +chair +chalk +champ +chant +chaos +chard +charm +chart +chase +chasm +cheap +cheat +check +cheek +cheer +chess +chest +chick +chide +chief +child +chili +chill +chime +china +chirp +chock +choir +choke +chord +chore +chose +chuck +chump +chunk +churn +chute +cider +cigar +cinch +circa +civic +civil +clack +claim +clamp +clang +clank +clash +clasp +class +clean +clear +cleat +cleft +clerk +click +cliff +climb +cling +clink +cloak +clock +clone +close +cloth +cloud +clout +clove +clown +cluck +clued +clump +clung +coach +coast +cobra +cocoa +colon +color +comet +comfy +comic +comma +conch +condo +conic +copse +coral +corer +corny +couch +cough +could +count +coupe +court +coven +cover +covet +covey +cower +coyly +crack +craft +cramp +crane +crank +crash +crass +crate +crave +crawl +craze +crazy +creak +cream +credo +creed +creek +creep +creme +crepe +crept +cress +crest +crick +cried +crier +crime +crimp +crisp +croak +crock +crone +crony +crook +cross +croup +crowd +crown +crude +cruel +crumb +crump +crush +crust +crypt +cubic +cumin +curio +curly +curry +curse +curve +curvy +cutie +cyber +cycle +cynic +daddy +daily +dairy +daisy +dally +dance +dandy +datum +daunt +dealt +death +debar +debit +debug +debut +decal +decay +decor +decoy +decry +defer +deign +deity +delay +delta +delve +demon +demur +denim +dense +depot +depth +derby +deter +detox +deuce +devil +diary +dicey +digit +dilly +dimly +diner +dingo +dingy +diode +dirge +dirty +disco +ditch +ditto +ditty +diver +dizzy +dodge +dodgy +dogma +doing +dolly +donor +donut +dopey +doubt +dough +dowdy +dowel +downy +dowry +dozen +draft +drain +drake +drama +drank +drape +drawl +drawn +dread +dream +dress +dried +drier +drift +drill +drink +drive +droit +droll +drone +drool +droop +dross +drove +drown +druid +drunk +dryer +dryly +duchy +dully +dummy +dumpy +dunce +dusky +dusty +dutch +duvet +dwarf +dwell +dwelt +dying +eager +eagle +early +earth +easel +eaten +eater +ebony +eclat +edict +edify +eerie +egret +eight +eject +eking +elate +elbow +elder +elect +elegy +elfin +elide +elite +elope +elude +email +embed +ember +emcee +empty +enact +endow +enema +enemy +enjoy +ennui +ensue +enter +entry +envoy +epoch +epoxy +equal +equip +erase +erect +erode +error +erupt +essay +ester +ether +ethic +ethos +etude +evade +event +every +evict +evoke +exact +exalt +excel +exert +exile +exist +expel +extol +extra +exult +eying +fable +facet +faint +fairy +faith +false +fancy +fanny +farce +fatal +fatty +fault +fauna +favor +feast +fecal +feign +fella +felon +femme +femur +fence +feral +ferry +fetal +fetch +fetid +fetus +fever +fewer +fiber +fibre +ficus +field +fiend +fiery +fifth +fifty +fight +filer +filet +filly +filmy +filth +final +finch +finer +first +fishy +fixer +fizzy +fjord +flack +flail +flair +flake +flaky +flame +flank +flare +flash +flask +fleck +fleet +flesh +flick +flier +fling +flint +flirt +float +flock +flood +floor +flora +floss +flour +flout +flown +fluff +fluid +fluke +flume +flung +flunk +flush +flute +flyer +foamy +focal +focus +foggy +foist +folio +folly +foray +force +forge +forgo +forte +forth +forty +forum +found +foyer +frail +frame +frank +fraud +freak +freed +freer +fresh +friar +fried +frill +frisk +fritz +frock +frond +front +frost +froth +frown +froze +fruit +fudge +fugue +fully +fungi +funky +funny +furor +furry +fussy +fuzzy +gaffe +gaily +gamer +gamma +gamut +gassy +gaudy +gauge +gaunt +gauze +gavel +gawky +gayer +gayly +gazer +gecko +geeky +geese +genie +genre +ghost +ghoul +giant +giddy +gipsy +girly +girth +given +giver +glade +gland +glare +glass +glaze +gleam +glean +glide +glint +gloat +globe +gloom +glory +gloss +glove +glyph +gnash +gnome +godly +going +golem +golly +gonad +goner +goody +gooey +goofy +goose +gorge +gouge +gourd +grace +grade +graft +grail +grain +grand +grant +grape +graph +grasp +grass +grate +grave +gravy +graze +great +greed +green +greet +grief +grill +grime +grimy +grind +gripe +groan +groin +groom +grope +gross +group +grout +grove +growl +grown +gruel +gruff +grunt +guard +guava +guess +guest +guide +guild +guile +guilt +guise +gulch +gully +gumbo +gummy +guppy +gusto +gusty +gypsy +habit +hairy +halve +handy +happy +hardy +harem +harpy +harry +harsh +haste +hasty +hatch +hater +haunt +haute +haven +havoc +hazel +heady +heard +heart +heath +heave +heavy +hedge +hefty +heist +helix +hello +hence +heron +hilly +hinge +hippo +hippy +hitch +hoard +hobby +hoist +holly +homer +honey +honor +horde +horny +horse +hotel +hotly +hound +house +hovel +hover +howdy +human +humid +humor +humph +humus +hunch +hunky +hurry +husky +hussy +hutch +hydro +hyena +hymen +hyper +icily +icing +ideal +idiom +idiot +idler +idyll +igloo +iliac +image +imbue +impel +imply +inane +inbox +incur +index +inept +inert +infer +ingot +inlay +inlet +inner +input +inter +intro +ionic +irate +irony +islet +issue +itchy +ivory +jaunt +jazzy +jelly +jerky +jetty +jewel +jiffy +joint +joist +joker +jolly +joust +judge +juice +juicy +jumbo +jumpy +junta +junto +juror +kappa +karma +kayak +kebab +khaki +kinky +kiosk +kitty +knack +knave +knead +kneed +kneel +knelt +knife +knock +knoll +known +koala +krill +label +labor +laden +ladle +lager +lance +lanky +lapel +lapse +large +larva +lasso +latch +later +lathe +latte +laugh +layer +leach +leafy +leaky +leant +leapt +learn +lease +leash +least +leave +ledge +leech +leery +lefty +legal +leggy +lemon +lemur +leper +level +lever +libel +liege +light +liken +lilac +limbo +limit +linen +liner +lingo +lipid +lithe +liver +livid +llama +loamy +loath +lobby +local +locus +lodge +lofty +logic +login +loopy +loose +lorry +loser +louse +lousy +lover +lower +lowly +loyal +lucid +lucky +lumen +lumpy +lunar +lunch +lunge +lupus +lurch +lurid +lusty +lying +lymph +lynch +lyric +macaw +macho +macro +madam +madly +mafia +magic +magma +maize +major +maker +mambo +mamma +mammy +manga +mange +mango +mangy +mania +manic +manly +manor +maple +march +marry +marsh +mason +masse +match +matey +mauve +maxim +maybe +mayor +mealy +meant +meaty +mecca +medal +media +medic +melee +melon +mercy +merge +merit +merry +metal +meter +metro +micro +midge +midst +might +milky +mimic +mince +miner +minim +minor +minty +minus +mirth +miser +missy +mocha +modal +model +modem +mogul +moist +molar +moldy +money +month +moody +moose +moral +moron +morph +mossy +motel +motif +motor +motto +moult +mound +mount +mourn +mouse +mouth +mover +movie +mower +mucky +mucus +muddy +mulch +mummy +munch +mural +murky +mushy +music +musky +musty +myrrh +nadir +naive +nanny +nasal +nasty +natal +naval +navel +needy +neigh +nerdy +nerve +never +newer +newly +nicer +niche +niece +night +ninja +ninny +ninth +noble +nobly +noise +noisy +nomad +noose +north +nosey +notch +novel +nudge +nurse +nutty +nylon +nymph +oaken +obese +occur +ocean +octal +octet +odder +oddly +offal +offer +often +olden +older +olive +ombre +omega +onion +onset +opera +opine +opium +optic +orbit +order +organ +other +otter +ought +ounce +outdo +outer +outgo +ovary +ovate +overt +ovine +ovoid +owing +owner +oxide +ozone +paddy +pagan +paint +paler +palsy +panel +panic +pansy +papal +paper +parer +parka +parry +parse +party +pasta +paste +pasty +patch +patio +patsy +patty +pause +payee +payer +peace +peach +pearl +pecan +pedal +penal +pence +penne +penny +perch +peril +perky +pesky +pesto +petal +petty +phase +phone +phony +photo +piano +picky +piece +piety +piggy +pilot +pinch +piney +pinky +pinto +piper +pique +pitch +pithy +pivot +pixel +pixie +pizza +place +plaid +plain +plait +plane +plank +plant +plate +plaza +plead +pleat +plied +plier +pluck +plumb +plume +plump +plunk +plush +poesy +point +poise +poker +polar +polka +polyp +pooch +poppy +porch +poser +posit +posse +pouch +pound +pouty +power +prank +prawn +preen +press +price +prick +pride +pried +prime +primo +print +prior +prism +privy +prize +probe +prone +prong +proof +prose +proud +prove +prowl +proxy +prude +prune +psalm +pubic +pudgy +puffy +pulpy +pulse +punch +pupal +pupil +puppy +puree +purer +purge +purse +pushy +putty +pygmy +quack +quail +quake +qualm +quark +quart +quash +quasi +queen +queer +quell +query +quest +queue +quick +quiet +quill +quilt +quirk +quite +quota +quote +quoth +rabbi +rabid +racer +radar +radii +radio +rainy +raise +rajah +rally +ralph +ramen +ranch +randy +range +rapid +rarer +raspy +ratio +ratty +raven +rayon +razor +reach +react +ready +realm +rearm +rebar +rebel +rebus +rebut +recap +recur +recut +reedy +refer +refit +regal +rehab +reign +relax +relay +relic +remit +renal +renew +repay +repel +reply +rerun +reset +resin +retch +retro +retry +reuse +revel +revue +rhino +rhyme +rider +ridge +rifle +right +rigid +rigor +rinse +ripen +riper +risen +riser +risky +rival +river +rivet +roach +roast +robin +robot +rocky +rodeo +roger +rogue +roomy +roost +rotor +rouge +rough +round +rouse +route +rover +rowdy +rower +royal +ruddy +ruder +rugby +ruler +rumba +rumor +rupee +rural +rusty +sadly +safer +saint +salad +sally +salon +salsa +salty +salve +salvo +sandy +saner +sappy +sassy +satin +satyr +sauce +saucy +sauna +saute +savor +savoy +savvy +scald +scale +scalp +scaly +scamp +scant +scare +scarf +scary +scene +scent +scion +scoff +scold +scone +scoop +scope +score +scorn +scour +scout +scowl +scram +scrap +scree +screw +scrub +scrum +scuba +sedan +seedy +segue +seize +semen +sense +sepia +serif +serum +serve +setup +seven +sever +sewer +shack +shade +shady +shaft +shake +shaky +shale +shall +shalt +shame +shank +shape +shard +share +shark +sharp +shave +shawl +shear +sheen +sheep +sheer +sheet +sheik +shelf +shell +shied +shift +shine +shiny +shire +shirk +shirt +shoal +shock +shone +shook +shoot +shore +shorn +short +shout +shove +shown +showy +shrew +shrub +shrug +shuck +shunt +shush +shyly +siege +sieve +sight +sigma +silky +silly +since +sinew +singe +siren +sissy +sixth +sixty +skate +skier +skiff +skill +skimp +skirt +skulk +skull +skunk +slack +slain +slang +slant +slash +slate +slave +sleek +sleep +sleet +slept +slice +slick +slide +slime +slimy +sling +slink +sloop +slope +slosh +sloth +slump +slung +slunk +slurp +slush +slyly +smack +small +smart +smash +smear +smell +smelt +smile +smirk +smite +smith +smock +smoke +smoky +smote +snack +snail +snake +snaky +snare +snarl +sneak +sneer +snide +sniff +snipe +snoop +snore +snort +snout +snowy +snuck +snuff +soapy +sober +soggy +solar +solid +solve +sonar +sonic +sooth +sooty +sorry +sound +south +sower +space +spade +spank +spare +spark +spasm +spawn +speak +spear +speck +speed +spell +spelt +spend +spent +sperm +spice +spicy +spied +spiel +spike +spiky +spill +spilt +spine +spiny +spire +spite +splat +split +spoil +spoke +spoof +spook +spool +spoon +spore +sport +spout +spray +spree +sprig +spunk +spurn +spurt +squad +squat +squib +stack +staff +stage +staid +stain +stair +stake +stale +stalk +stall +stamp +stand +stank +stare +stark +start +stash +state +stave +stead +steak +steal +steam +steed +steel +steep +steer +stein +stern +stick +stiff +still +stilt +sting +stink +stint +stock +stoic +stoke +stole +stomp +stone +stony +stood +stool +stoop +store +stork +storm +story +stout +stove +strap +straw +stray +strip +strut +stuck +study +stuff +stump +stung +stunk +stunt +style +suave +sugar +suing +suite +sulky +sully +sumac +sunny +super +surer +surge +surly +sushi +swami +swamp +swarm +swash +swath +swear +sweat +sweep +sweet +swell +swept +swift +swill +swine +swing +swirl +swish +swoon +swoop +sword +swore +sworn +swung +synod +syrup +tabby +table +taboo +tacit +tacky +taffy +taint +taken +taker +tally +talon +tamer +tango +tangy +taper +tapir +tardy +tarot +taste +tasty +tatty +taunt +tawny +teach +teary +tease +teddy +teeth +tempo +tenet +tenor +tense +tenth +tepee +tepid +terra +terse +testy +thank +theft +their +theme +there +these +theta +thick +thief +thigh +thing +think +third +thong +thorn +those +three +threw +throb +throw +thrum +thumb +thump +thyme +tiara +tibia +tidal +tiger +tight +tilde +timer +timid +tipsy +titan +tithe +title +toast +today +toddy +token +tonal +tonga +tonic +tooth +topaz +topic +torch +torso +torus +total +totem +touch +tough +towel +tower +toxic +toxin +trace +track +tract +trade +trail +train +trait +tramp +trash +trawl +tread +treat +trend +triad +trial +tribe +trice +trick +tried +tripe +trite +troll +troop +trope +trout +trove +truce +truck +truer +truly +trump +trunk +truss +trust +truth +tryst +tubal +tuber +tulip +tulle +tumor +tunic +turbo +tutor +twang +tweak +tweed +tweet +twice +twine +twirl +twist +twixt +tying +udder +ulcer +ultra +umbra +uncle +uncut +under +undid +undue +unfed +unfit +unify +union +unite +unity +unlit +unmet +unset +untie +until +unwed +unzip +upper +upset +urban +urine +usage +usher +using +usual +usurp +utile +utter +vague +valet +valid +valor +value +valve +vapid +vapor +vault +vaunt +vegan +venom +venue +verge +verse +verso +verve +vicar +video +vigil +vigor +villa +vinyl +viola +viper +viral +virus +visit +visor +vista +vital +vivid +vixen +vocal +vodka +vogue +voice +voila +vomit +voter +vouch +vowel +vying +wacky +wafer +wager +wagon +waist +waive +waltz +warty +waste +watch +water +waver +waxen +weary +weave +wedge +weedy +weigh +weird +welch +welsh +wench +whack +whale +wharf +wheat +wheel +whelp +where +which +whiff +while +whine +whiny +whirl +whisk +white +whole +whoop +whose +widen +wider +widow +width +wield +wight +willy +wimpy +wince +winch +windy +wiser +wispy +witch +witty +woken +woman +women +woody +wooer +wooly +woozy +wordy +world +worry +worse +worst +worth +would +wound +woven +wrack +wrath +wreak +wreck +wrest +wring +wrist +write +wrong +wrote +wrung +wryly +yacht +yearn +yeast +yield +young +youth +zebra +zesty +zonal \ No newline at end of file diff --git a/gym_wordle/dictionary/solution_list.npy b/gym_wordle/dictionary/solution_list.npy new file mode 100644 index 0000000000000000000000000000000000000000..a03dd86f11ea17ef47b9655f06f9ac5941ca67b9 GIT binary patch literal 92728 zcmbW=JIilbv4!z&@3!~*CED3m=tQMK#Mn$RF))(G-l8BX-C`ns3cs)|zQ5#wK`lJV zWUcwEQB|XAuJwPno^$^FtKah&M~ z`r+R{eE%=M`|F1vy!r3_U%db4kKTNI|D!*?|F<_EU;p68Kl#yn@4kBPhwr}n*Q@{U zf8Kfft^fVcCtg<9pM1IgLhhIQ#>@Vv5AK@>N0-j`h92%KFZ*=mZU1vG`?#+Uz0beg z|J2JWe)YbXeSA6b>@Pi>yjC5!Z@t97xNj%V=11r18~<@udgeoZ>iF_Y{Bri|cRBS{ zx12ig^_l;k`|R+g+*gOsIB_oSOD{U=tuOS-sYl*8ewc50EbhvWp1xdqxK)RKI47;+ zGcSHv`SRVD`|9YvxXllz4(p0*zj-#U=fx8rXO3K}qrQ~W54xT&*ZAc;FCM;}y!69! zi=)?kT+`v>chWbUeR|#_jf<KeVlV^ z{uU<=z4n(Lzs2#KYn-~pcfB||`nNdoFV61=x=U|;x7183rXY$zJAm{`8kL3w^k3w$IcZ!eHFKJfYZ0Dj&dumIg!8m)zN(Hi+^$L zNA>8?U3zp{NA=Xf@9OCXKUZAuy(>TQ>Gb!IeXBmNI&k_Te(RuPKE*G`2X*`1U(Wj* z*SO;816?{+bLV>TIPV{E)#G`beg5=(;Oy6r>fzN{-o6#rzS&nNpXAZFd|P^SyszlF zPtP^KE>3;Tt9pDjf1WF+AI{t2oUcw4g@t$wr>|5#f_kn%!aP<+Vzxc*= z-#Mh`Ir-w85B@eTPCv{8zIxtk_FFGKtLIl8IC`zawK~ncm3}#O(k+KqH$QRammfHJ zTpay!JsfK>ep_7o=6A6C>x=J&e4Gby>6PQZx#siY)M=i} zRR_N~{L*V5)LlJsQmL6`^ zTfHkkdY)Txy;qhm_T}%KR}W|Z(z|@7XI=B+{oy<<&V6y6XLZO|Ust{5R@`#t5WnK; zm%7W*z4F6(|Ej-w_RY(R>-_Mi^Cw=pOV4u`C%-GMzAmmh@~tn<;pH=qu6mXp{wcTm zM#nrm2aU^zs}A!iuhkEnb>(NDj`u?IGw)YiIym)L&+n{@^Icz@e$p2Y?>>&d_WgZY z&iS|2KYHd;f7M?-dEv!h9Dc<$FPC09c{Z;5zWXab^TNl@3tw>jSe&^MU%t(cjizrSAP7}zjDrxzTp>loez5Q=ljyTe4%GueY0=XmlfCd zRQz&&XUN}qTAbfm*2Rgpd=|IymLBfXGbeqY@=O2e)#q~b8W$&DYu~##e(?F?e78JL z-!(lx%Cj8a{S_BSXVr_dzkDut#dU7^BVRgJ+|tumefIAo)x+^|#pQ?iJ#X>Sdjh zdA}_G^wk_(T;Kn#m!5jp+w|v1_uedn6D?eP{<9xC2 zJ-yC3?m9<(@6v64IQ>|0adhgReSTRx2j$G&(z9<}diM2y>2*%z$rt&RQ+GM>#9wi7 z=491@vo6j#^L}aH)Pb`uJ#%=)#nD^7;LO$H?DK8)1Eds@J}F zbgS2MyY%FvuggF4Aub;qx7_ki9Q7|foVr&XIP1m9OFgZF4$gHs|9(SrJC$Fn-xE0s)=3)6)Zsmtl-|8FA`jq20eRDuZz1E9cb(l}jul#WO zFAvYj4`+X!Bb>RXyYz6LyEy#f%!xb~=Ny@v#p&0YE9cDf%V(TA>3WXOI6A8i9G&HJ zxl7O7Ezb8t-tu&<4xD~0|8V+o>8TgL;yM?tga7=pPnRCf?-6sdxRp=!`aIoo{r=jw z%CB6{hwH|v&*kXrpSb1hx4-51!_TFMyYe%q=56WWuKaM;>X{Qh%JbsdZ@yH|ye>WO z+lv!#`KPbqT%5R8l+Iq>)G;`p}afF5q;=e?#M7bl;K6IXvcr(SW*$;Ii{np1k- zgWgLkE{^Wvyce$g{JVy_t0$iO%RiiWs}7ubS?3Zbug(kK^k07UxtzY$Kb-k>j;fCn z&-LOuH|pv0<-{+?H$JaAaL#T2Zj?99xf9P?4!`PceXAchb0SXT;;#J6k^b_hdVG~X z-xo*6bBmMb^4UCle))nk?-wV3KGNqWJ^8J9!SPYuOOGE*ukRo6t5=Th#XXI?`r*B& z&K1}5e0D8A&zUFp`<^W4T(*vK&YQl_FUMc?T-=qPbJY23T%2{qRp*so=V9sTpS~>4 ze;?$Ei(CEmygo1g%IRP8!#TIk>*C5^+?5}_HCOiK?|Q|h^OQ3WOV2!6FK+4eyRm%1 z$zNX@x195^xXV9!I6f{tek{%$U2}>PXZeD=-Y@0WIl@`5xazgam+y4?{aT#&#_BIU zoVu$g9vySDIQ#2;Mb8}g9lG>zYYyn~ZN10Kt#hQG;+3N#Z*whwD^C8n`i#?Ooc>e~ z$6xs_4u5g{)4!#+zFVyWx8m|uy^ZTRKHFE1{BW-Mf_ERse{t=bZ|@V=R?oY}(GmCJ zp7e}@aniY`_6gw%nMz9FHZmHE>1oE zUb(oXrw{T|clFA(AN<34U#xn|U3zpD=Xbq4@U4Ttd@~P=`Sp46t0y0EFOF|3 zu6fs&=28D~o#%4mUV6BdpZQa#`s<6ox2@G{9?QSQEj>Es%Q=uAJ^plV%9&5=ic5!n zeQ_V>yz{$py|4JZ;?nWHT6#GCbYA4=?;`oExH$Ro$8*(F_oc_T#hE8@>5A)lefPbt zFXcK9OV8i4;xBH^U*pQ3?$YZ#EKXnAkH*D`Up@8l(Y}>lIdw12`^{QTAL!b*id)Y8 z#a(kik8jqc$G6otdVOD3&pE-bImOA#y7c5%ANfSjdg(EcWEj^q$UYvb#`#s`c z=frdJGauel`sKWrQy-tL7uUGzGIxCReHBMuy)Vzj$;-Z#p67A$S)Ba&Tu$HIr|Vi= zI_|66_2T4<^Lxd6g-+`*AM#oH`llbBYrf^oN#n{>-gMo!>MPFu#`Qd2AIkZ^14d`n z;T+QCAAQeXzLjfVoUd|xbiehBYk$>IPX6r&PQO~WI5_*wb8+oMIdkfLYTqiZ_tuK* zy={)=>3MoM{cyj!i)%k{`arKMPMv&dKg^pt=;G<(x!N>d-Iy`r$nzzjFRPs&T*e@_&y|o%+x@Eyp);#8n?1 zKH9h9T&rXGsb2HtIV(LY-gPjM#adgDNyQb$_y-QEM)$u$%oW3qS zbL{!*((^nYFHRl&q)*RW(V>siZ*`a#-+$kE`o4qo=#*f>REAd*2T%6-ij-KzRS0D;H)d|nuF@$)FFPko_BTO)a7|T%d;Fm@U54gc`={z zte)qsbQkBmEj_=3tn#UzeLgN<#8LOs^Su1k)3`Wm=YT%{FFl<6dXB26FTP97j~-vl zLpgIrUp?jeyS1EryswsCIXZZ8ar{_y;5@Hi^`)G7xH$Q>zx3qG@AhqROV2r@LsuMn z>QuKpFYeN#yYjQ|++Cb_>S=!Zu+E2iapvLDyL{o7b0N>>XJ5QkukZgA*ME*zXR1#j-T#docN0qPu&;SdgY-Gb9L#N2k}>2`CoeN^U}kuxZ+&>z*#$g ze6cUCIc$FVdd0=j<ZNC0=g7WQo~^h0@?4z0Sr_N~ zcE!bAzW842U*pnozpMGf>EH4X=UkXCy4AbRIX(HW`70;>imMOn9MR+Ns>6HCe*0!l z%!hhCCqJAy#`9}&@>EYbepy#seWj!B>d6N$@5SL)Tz;wd;`qbw#-*p;r`)Q89zQNU zT<3~@^{#sL*W9#T`_4ztrMTkAUmo;a>x2I4-{Ry&cX9ITxolkZv<{p&@?3g2>!pVi zr*+tOKH6W;@lAg2R}V*b<%iP;>(Z0o@`au`_4~7W=EiwjdN}=Eb(9l-#Z||}*sm!AGx z7pGrVocf(Zd06>ej$ie;T;F@@SsY$Ii_>p&U5+2tRWBWLcyZz^U+9^Gl^;$&mR|q8 ziQn?zlXKfSEvG*5RzGm!xvpOGubw!4KYEYQ!&z4y_O1Hsx_bIxUN27m<-9lLEpGc; zPM`TGKl$jNJgbK@pVsyR=Re1h-{RCMuZxqH`dUZlR6Q3b51f4XqTcqSoOt-9C*GyU zKkL%#{Ff6)J>G8@r=D{9tWNriqoaT2%(MJ1uK!-W^ysd7?dwP9Pk(XxU|n%Lhvmd^ zPCC#0;)i&Plb<@<5BvJ1E_uigr@!*BZ^h9OPyEH&^1Qe!Kj-qQ z7uR#ydd&fT<%hE_PX1SZ>pj%`aGmFJ>pO#!kNJ{k>%du8-|SoU`O;f)%@aNIT0NZk zv@XtjkM6}SpT$+@@&#v}R$T8j{h-_YaC9#YukNMyG(YohU3%VwbT4krf&9(=<)6Q6 z)*R5oE&t>%-qORFPiyPNiPw7V>%Vi_xhlsO&xwnZzkXRSZslk0bVvV?>>LbnL71Z{Briq z^U~w5dDge;IX~uU>8ZoIIC))qIC<$`^TR!ji@);I5Am$}VP7BQd2uT)ot}^C;lxu< zIp;+GJhwRebjx*4=q}E=Xg&Pv?F<;;ivuR8RBj_2sfM?7om#d&`Dhx5L$ir={Qtt+lR zsF#kFzIj%+ewXvUw>B<4^{oEl_-0*t-n058&*sNx+|t9zW9hli54w$uqr2kb__Fl$ z%|3q`7iWLP?R!@})x%x+^}Ql~^~$NgoZsQ{Y8~=22j-RE^van-x{F(LP(A03j^b04xxsbPO zb1WbC%gN9C9H&n4iM#YxJ$hvq^MkJV<*Hl%ypJ#c za8|xFu6*R(_ow`P$K|Ik`T6hDt5ZDwh*QqrTh{8ySH0H7$*bQtap}p&y7c@m@tpYd z_~RT|tH(F|@}->q$x~dMI_0PSa`LvW{Pb|1f>+*&>HLu`mywI{4)2A>wQt3#W`=~ z)gkZJQ$3t>S_&f?@RkHyi!FHZc$`QGq_ZuRtuPV;l0U#s47&N+Q? z%dL4SXTH?E^vu`Asgv%~GY9gyxccll{?WVgGpC+!T<-(@U7Y(@-*9|cebZO@FHT{op*VzTwQjdK%Z9$YXJ<57jGIJ>QM%yMU7yUtEievv2P7rJQp{r~c9N zoW7YG_i=nykG?FTh9EHqib%KFF19sI?S(i z=~V~c{Oa$DTW-ZQr*u|azptNi@?LS>UvnjY{nTIcL%*E&ApLUAk2*RB^l)nqaGqC3 z{VS&)@0sRD&%DaBoV@6ppK|iK;^Ho!#qoZr&#vjT9{J(wbA7?lS#{uA2VNX~a^JQ2 zUYxv~`^AaBIP)tm9jp7etFX5XO8-u`Qu}scU?|Bm)@$QdRKn>BA*o(x8^|HYyNQZUw!kwqPKkUyu6&d z)`7DwU+jBtEj|0{P*>yPtg8<1$Eyw;omGeTe81Ptum8E6eXF?;$2k&zaeUz?&U1A2 zm;U1TtNz8=UwZtt%AaQM7UUU~{pFcQx^W);o!SaP3&N-KFRT=U1j zrKhjztUBanUB2)` z{wqJ6KKr|%`Qg-|{>7Cq*SW(lj&J&RahIO_=`KA!^Ko(Ft-kg5m-yAg>Boxe?@s&G zQVoI0DI`&K@-Ui zeQiH*{J->Y>hU~ZTzB7d<<@&+ar|h#>NMx_XxwuAz>AA>zq;k>uem7a+P^262lvHw zZC&-+7f(Iz`#$>nn1AZJxW=U?Pv>drm0Nn=OZ+g0%}@L*uD)NsRA=Q!#~du5JNNun zhxe}f%uW5nsiS#TPkz?c;aWa?q+`YDM}Pl$PM>@?nm^9m*>4>r~O zTEBQWx~}QzmldZ!ixZEpIKOMHD?j_z71zGJarH$$t>Y=zdg(dmoqzS3C-Xo@p5@$k zKKO%^ueiP6>&_jYaOPZG`86(1TzPn|dN}jUhjQ}4n@gO0_=odcx%Sudsbjx{O-S(~YaCBNnIeF5tnsf6(r{}y}<5#bF;mheie>_*t zHNO7%{biqC>&Dp^Pu=45-|fZ2u@t2O3&*kLpIlARqFQ3bKzsX;{i}RjY z`N@YK{p#W5Y5o^?#qDz|E>3={UiY7JekbUQIIihgmw)!vEB?~c*QG}XC!gw-TXD;+ zxZ>%n_h94V%z^W=IPtHzbQkA6NN?5adHdGpS56;sp5s4X+`qW`=Q(=fb?$NE;hn$6 z_5Q&vJc`?%Tzc|zEiV7%C+_0(b@@zBeR$W6>%RP22R+|k>*CCj{OLBXI_1aL#mRHU zrFZ#)lb1Xj*R{CLf%|;v|9@3{Iq|M~ar{{I`u!!ZSvBe#i%@*8&}@;+Yfr`HZK=P z7vH$_T4y=&&B5}|bJpt8k@uxn-#ka39!_6YKX6ulSI?YY`Qgk#&zt;k@>;(5dtP3x z*R_6%tIz5vM;BjCJnO~r&ssfw;2+(KTXoRm@1%i%gb#d|%=i<~=U&Q5y{QEt^iC2HzFUObW zTh8;V4(Cq(R?pEZ=X!Daap_(D+2`A;!+XqH&b7SEo%{X!N+0yi`+jll$KvSlWpVl{ z&&BBj-HYST;_COssk@x|tj@v3sb_I~u`Z6z>aV=iyL`bp2d*2J57)fl=&ZOnby`OM|f>&5Z2 zoadb%^Sn6o+HKQOV4{uUg~Kb?(56a!|{9Nhx6VSzj5WyZ@T4N zSI2!m>jT}DpYtQ`ngg75>Gk)a`kSBU#ao=;;W#>0KB#;3ZE@;Zdio&W#hF8MwmA0} z=e?pHyj2}I*WxeE_rqLV-13FL@-tu6!-;F(D(`YDF8=C=-`9BYtnTB?{fg_{s(1P9 zJ%Q7o#ubll=U#r|(DQdv^~$X|#fi`N>X}R2@Qf&xH$Vu zPaft}zV3_T+_+x8;P|)nJg*Ptr*U!a_dU4sS@o(@o}Q=gy6B^Jy*SQ_O0|9Z|Rkz zW38Uw|N33d{COYf%i`2)-zqLWT>Hj<@z%L4r|zZaJ0OqxM-S(E>B(#P=Xvv{UibOp z+Wg_{Tg$C;jd*1jfp4D^o%B{FK{WAYcPd=BPxud6^=7-~_eXIQXo@{)a=fsn*`#5uA z4%F+u=lM%#alTv4t9pI^h+j^;=CL^Z%FjNZou{SO`@NmaE;aA_ff9dJRQ%;^MKko&)7q|MM4!=+MSUqu^J9B+;%RhSjur59O@?0EW{O-88 zRY!HyO;0}FJNDZ*oE6{mX5a5H@!fA+=g7ayE>3;+SAOe$Mp0hxSn76;M6PM zrRTfg`Eur*o_xzyXVqU$zST3A@+#-=8-Drj`1_GwIrBpI;yPE=(+55+J$YSmaaUaL zl}it2UHRF+>M&1NT>V$iiff)OJ^k0erH6Z}cjZSY!tN8h6bL9q+5-^H=@1=)Z{#9?);dhC- zTK?g#_bE=js}7uX)nVUy)xno5E>529n|Qb@uJ7Q*UGD>Ny$`PZaBHsQ&kua-#i^se z>wMqJ`5jd~I@i45)Vch_HBPVjV2)kmoC|))-}T~F-{{fdQ|l<_d+FRYuKb;gRR_+x zIR5I#suyR!^P&!%y78^Uyx8|#IoH-zhyPrdzx?)`{K{32ul%PcPkK1I_SLmG-w*5J z^v$|B^V08h^OKi)s^=Vu=lP4nFHT>p=Q%!`zl-BHU2&^t-yB|CeW{-3J6GlCmhD#oZnxUp1FU@^_=rX+-qLStvYt--~m<{Sa5* zY0(xRsxIrX!E);pEl+$`2>rrH5O-m}l>o6&GiJ#Vxny1t-7iIS=}^@+-$5 ze)GB9s$+4jqny57b>LQho>#X#TL;ccw;Vs#`(7P5zn82_&wEAua{6n zJ@3Jb^ZR=Bm(DeRIKEls#|M4oN8{rB{l^b=SI_S*>(VoC;x9d%c`!GPi(9|1)M37^ zxHxh7-MDo1weL0iR^0N157x!$uRND8IB{2g=5F=ZeDIAQc)paA*Tt!$@0aTF<C(otF=Sz<+zn7kKV!b$Xvp9ZSadDR(KUP0_9@X9a%Jm%S zFOJTtqulZjr(bkeez+??@vKYF{_llfQF>Z@oD6EY5ou=eg?P z^ke0Rv-Z1cuIyXsuDG}>Kb*cSy{jK|aF>7mjx;VEeOvQ_6_mZ<>bYW(b+I`%yjlwcf?m=f&}R<)^P#e$LNR zj_!&}&$>9@E9ZZ4{J8wXUHS3tsu%ZEPoGvD?)Uek=gg_=E5G%-z0cEK{)vNI^_E-x zEvL`wZ+`eIKim};x8};eRi9UW&ae4e9G%6{x!yxK?;mU9;`m{`IQ}nA{@!mFx8_BD z^j2Ko)yo$gU3~My$xELX$G3|!$7`;{Rqv&T>vx||^sMWA*te=@)r-68Fwa*VIDW6V zI6hw7<%{1Z{91a~ds1HBf6JG0{=RM8a;pxUdA{Oa_1bqXRzGm&Y2}CW{;{@RoW8C) zaOQr!U&>u|&|7n$KIfwIES~8t!aw>bH){N&FMbyW{%U7UWY!`xI) z{??_Z@A6;1xc`*n8@~C`yXy6v-(ULUzVplv{ygQ>zx3oucX95^({=MRFN@=sdc?0@ zIl7C(uX^oUFFk#;uDIeYJ$>??x;XKyjZ4qmtLNg(>*Dm`itG8+U*B=7JUwS#>|6P` zIQjWLT-@?SJbEiX?@Rmj&-=zc-R6fAkFI*ngY)3u3#^`BoPMcyaq_d4^PV+d_O0^6 z^?hH?yjxct;_;D=Rb27ZS$=VRuO8p5D?j^uTXDTV<+tK`-aOH5e&tqv=IDxxIk9e!N-bc9V$ro?_z5nQyZ9GrSr z9XNHDGr!`=&vRCs`tYrz9DZ@$C-Q2&^xPL$J%3iY)m#6nhr8;<$;(hs`&V4= zBRbZ`?SEcTj?UGOa;qOW`O9a;w>Ba<1)r&VBD$zKQR9T~2-Y&I>)9 zweOe3iD$*t54wv}$HnnO|CZjGzvk!n1Rbk6R)_rfZ0`7EmA^c3@--h9Cl5OMN6&nk zr^U%zTzQC3ublhxaE-g_EyqXCEj{;Fe*V41{?fyVyXvry*LQiS1Ls`2zc}&ad2uVQ zeu+=FdgejA#W@!j=Xr7QjayE><(xY@t8e~Z6W4p3o@*;T^Iz_&*K^L1bJqUi`GPa2<>ad$`h#y>?#s{nW^v++Q;z@QU!1vp%E@!Z z?S0q!U6Dt)x*(QaXoL9XZ7^W_XS^0Jo`(}oT_)_=RO^}jf*oc z`drR^{&k++$Ek<@(xW5Ka@}8b^f`0U`+jfoPk(Uo?))__P8`4MTL;cu@mc)F<)io) zC$AOPdx9=M8`pjD+BbE`Uw*!y)$8vKdE%T0dFcb6Jg+YC`0V*|en+;Ba^gJY)GyEK zsl)v9b8&nSzZ}2l_+3^`pK!~U=C$I|;kW)aE{={o%C*kLt#e6F9P>b@^_FY=>N&ri zhjMiBE3P@9SO4hX)Iqm#&B5viJ)AzTxaN21d5+IG=T3g*#Fx+F)a#s<^St=xY;kz; z7iZu1b8+&cTTb8j!iUAF)4DkMU2*mADc3obuR7E#{>sl>tvR5lUn@WFQSmMgzxrlh ze$|tg^JSlp>RlXv7AL-aYxVfT|8nx;i+s!Vy+XGf9c$-6etsYDcX9kO_wsGra;sjP zI#=BGb@c;x)xj@yto(4+=BMw@13%Qo7aX6x*DmhTqr3dGZ>3lN>|58o*thyUvV0Ne z$`2Y&Fjx=Rmt z#l str: + """Converts a numpy integer array into a corresponding English string. + + Args: + array: Word in array (int) form. It is assumed that each integer in the + array is between 0,...,26 (inclusive). + + Returns: + A (lowercase) string representation of the word. + """ + return ''.join(_chars[i] for i in array) + + +def to_array(word: str) -> npt.NDArray[np.int64]: + """Converts a string of characters into a corresponding numpy array. + + Args: + word: Word in string form. It is assumed that each character in the + string is either an empty space ' ' or lowercase alphabetical + character. + + Returns: + An array representation of the word. + """ + return np.array([_char_d[c] for c in word]) + + +def get_words(category: str, build: bool=False) -> npt.NDArray[np.int64]: + """Loads a list of words in array form. + + If specified, this will recompute the list from the human-readable list of + words, and save the results in array form. + + Args: + category: Either 'guess' or 'solution', which corresponds to the list + of acceptable guess words and the list of acceptable solution words. + build: If True, recomputes and saves the array-version of the computed + list for future access. + + Returns: + An array representation of the list of words specified by the category. + This array has two dimensions, and the number of columns is fixed at + five. + """ + assert category in {'guess', 'solution'} + + arr_path = Path(__file__).parent / f'dictionary/{category}_list.npy' + if build: + list_path = Path(__file__).parent / f'dictionary/{category}_list.csv' + + with open(list_path, 'r') as f: + words = np.array([to_array(line.strip()) for line in f]) + np.save(arr_path, words) + + return np.load(arr_path) + + +def play(): + """Play Wordle yourself!""" + import gym + import gym_wordle + + env = gym.make('Wordle-v0') # load the environment + + env.reset() + solution = to_english(env.unwrapped.solution_space[env.solution]).upper() # no peeking! + + done = False + + while not done: + action = -1 + + # in general, the environment won't be forgiving if you input an + # invalid word, but for this function I want to let you screw up user + # input without consequence, so just loops until valid input is taken + while not env.action_space.contains(action): + guess = input('Guess: ') + action = env.unwrapped.action_space.index_of(to_array(guess)) + + state, reward, done, info = env.step(action) + env.render() + + print(f"The word was {solution}") \ No newline at end of file diff --git a/gym_wordle/wordle.py b/gym_wordle/wordle.py new file mode 100644 index 0000000..37de045 --- /dev/null +++ b/gym_wordle/wordle.py @@ -0,0 +1,296 @@ +import gym +import numpy as np +import numpy.typing as npt +from sty import fg, bg, ef, rs + +from collections import Counter +from gym_wordle.utils import to_english, to_array, get_words +from typing import Optional + +class WordList(gym.spaces.Discrete): + """Super class for defining a space of valid words according to a specified + list. + + TODO: Fix these paragraphs + The space is a subclass of gym.spaces.Discrete, where each element + corresponds to an index of a valid word in the word list. The obfuscation + is necessary for more direct implementation of RL algorithms, which expect + spaces of less sophisticated form. + + In addition to the default methods of the Discrete space, it implements + a __getitem__ method for easy index lookup, and an index_of method to + convert potential words into their corresponding index (if they exist). + """ + + def __init__(self, words: npt.NDArray[np.int64], **kwargs): + """ + Args: + words: Collection of words in array form with shape (_, 5), where + each word is a row of the array. Each array element is an integer + between 0,...,26 (inclusive). + kwargs: See documentation for gym.spaces.MultiDiscrete + """ + super().__init__(words.shape[0], **kwargs) + self.words = words + + def __getitem__(self, index: int) -> npt.NDArray[np.int64]: + """Obtains the (int-encoded) word associated with the given index. + + Args: + index: Index for the list of words. + + Returns: + Associated word at the position specified by index. + """ + return self.words[index] + + def index_of(self, word: npt.NDArray[np.int64]) -> int: + """Given a word, determine its index in the list (if it exists), + otherwise returning -1 if no index exists. + + Args: + word: Word to find in the word list. + + Returns: + The index of the given word if it exists, otherwise -1. + """ + try: + index, = np.nonzero((word == self.words).all(axis=1)) + return index[0] + except: + return -1 + + +class SolutionList(WordList): + """Space for *solution* words to the Wordle environment. + + In the game Wordle, there are two different collections of words: + + * "guesses", which the game accepts as valid words to use to guess the + answer. + * "solutions", which the game uses to choose solutions from. + + Of course, the set of solutions is a strict subset of the set of guesses. + + Reference: https://fivethirtyeight.com/features/when-the-riddler-met-wordle/ + + This class represents the set of solution words. + """ + def __init__(self, **kwargs): + """ + Args: + kwargs: See documentation for gym.spaces.MultiDiscrete + """ + words = get_words('solution') + super().__init__(words, **kwargs) + + +class WordleObsSpace(gym.spaces.Box): + """Implementation of the state (observation) space in terms of gym + primatives, in this case, gym.spaces.Box. + + The Wordle observation space can be thought of as a 6x5 array with two + channels: + + - the character channel, indicating which characters are placed on the + board (unfilled rows are marked with the empty character, 0) + - the flag channel, indicating the in-game information associated with + each character's placement (green highlight, yellow highlight, etc.) + + where there are 6 rows, one for each turn in the game, and 5 columns, since + the solution will always be a word of length 5. + + For simplicity, and compatibility with the stable_baselines algorithms, + this multichannel is modeled as a 6x10 array, where the two channels are + horizontally appended (along columns). Thus each row in the observation + should be interpreted as + + c0 c1 c2 c3 c4 f0 f1 f2 f3 f4 + + when the word is c0...c4 and its associated flags are f0...f4. + + While the superclass method `sample` is available to the WordleObsSpace, it + should be emphasized that the output of `sample` will (almost surely) not + correspond to a real game configuration, because the sampling is not out of + possible game configurations. Instead, the Box superclass just samples the + integer array space uniformly. + """ + + def __init__(self, **kwargs): + self.n_rows = 6 + self.n_cols = 5 + self.max_char = 26 + self.max_flag = 4 + + low = np.zeros((self.n_rows, 2*self.n_cols)) + high = np.c_[np.full((self.n_rows, self.n_cols), self.max_char), + np.full((self.n_rows, self.n_cols), self.max_flag)] + + super().__init__(low, high, dtype=np.int64, **kwargs) + + +class GuessList(WordList): + """Space for *solution* words to the Wordle environment. + + In the game Wordle, there are two different collections of words: + + * "guesses", which the game accepts as valid words to use to guess the + answer. + * "solutions", which the game uses to choose solutions from. + + Of course, the set of solutions is a strict subset of the set of guesses. + + Reference: https://fivethirtyeight.com/features/when-the-riddler-met-wordle/ + + This class represents the set of guess words. + """ + def __init__(self, **kwargs): + """ + Args: + kwargs: See documentation for gym.spaces.MultiDiscrete + """ + words = get_words('guess') + super().__init__(words, **kwargs) + + +class WordleEnv(gym.Env): + + metadata = {'render.modes': ['human']} + + # character flag codes + no_char = 0 + right_pos = 1 + wrong_pos = 2 + wrong_char = 3 + + def __init__(self): + super().__init__() + + self.seed() + self.action_space = GuessList() + self.solution_space = SolutionList() + + self.observation_space = WordleObsSpace() + + self._highlights = { + self.right_pos: (bg.green, bg.rs), + self.wrong_pos: (bg.yellow, bg.rs), + self.wrong_char: ('', ''), + self.no_char: ('', ''), + } + + self.n_rounds = 6 + self.n_letters = 5 + + def _highlighter(self, char: str, flag: int) -> str: + """Terminal renderer functionality. Properly highlights a character + based on the flag associated with it. + + Args: + char: Character in question. + flag: Associated flag, one of: + - 0: no character (render no background) + - 1: right position (render green background) + - 2: wrong position (render yellow background) + - 3: wrong character (render no background) + + Returns: + Correct ASCII sequence producing the desired character in the + correct background. + """ + front, back = self._highlights[flag] + return front + char + back + + def reset(self): + self.round = 0 + self.solution = self.solution_space.sample() + + self.state = np.zeros((self.n_rounds, 2 * self.n_letters), dtype=np.int64) + + return self.state + + def render(self, mode: str ='human'): + """Renders the Wordle environment. + + Currently supported render modes: + + - human: renders the Wordle game to the terminal. + + Args: + mode: the mode to render with + """ + if mode == 'human': + for row in self.states: + text = ''.join(map( + self._highlighter, + to_english(row[:self.n_letters]).upper(), + row[self.n_letters:] + )) + + print(text) + else: + super(WordleEnv, self).render(mode=mode) + + def step(self, action): + """Run one step of the Wordle game. Every game must be previously + initialized by a call to the `reset` method. + + Args: + action: Word guessed by the agent. + Returns: + state (object): Wordle game state after the guess. + reward (float): Reward associated with the guess (-1 for incorrect, + 0 for correct) + done (bool): Whether the game has ended (by a correct guess or + after six guesses). + info (dict): Auxiliary diagnostic information (empty). + """ + assert self.action_space.contains(action), 'Invalid word!' + + # transform the action, solution indices to their words + action = self.action_space[action] + solution = self.solution_space[self.solution] + + # populate the word chars into the row (character channel) + self.state[self.round][:self.n_letters] = action + + # populate the flag characters into the row (flag channel) + counter = Counter() + for i, char in enumerate(action): + flag_i = i + self.n_letters # starts at 5 + counter[char] += 1 + + if char == solution[i]: # character is in correct position + self.state[self.round, flag_i] = self.right_pos + elif counter[char] <= (char == solution).sum(): + # current character has been seen within correct number of + # occurrences + self.state[self.round, flag_i] = self.wrong_pos + else: + # wrong character, or "correct" character too many times + self.state[self.round, flag_i] = self.wrong_char + + self.round += 1 + + correct = (action == solution).all() + game_over = (self.round == self.n_rounds) + + done = correct or game_over + + # Total reward equals -(number of incorrect guesses) + # reward = 0. if correct else -1. + + # correct +10 + # guesses new letter +1 + # guesses correct letter +1 + # spent another guess -1 + + reward = 0 + reward += np.sum(self.state[:, 5:] == 1) * 1 + reward += np.sum(self.state[:, 5:] == 2) * 0.5 + reward += np.sum(self.state[:, 5:] == 3) * -1 + reward += 10 if correct else -10 if done else 0 + + info = {'correct': correct} + + return self.state, reward, done, info \ No newline at end of file