mirror of
https://github.com/ltcptgeneral/cse151b-final-project.git
synced 2024-11-12 22:26:19 +00:00
95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
|
import numpy as np
|
||
|
import numpy.typing as npt
|
||
|
|
||
|
from pathlib import Path
|
||
|
|
||
|
|
||
|
_chars = ' abcdefghijklmnopqrstuvwxyz'
|
||
|
_char_d = {c: i for i, c in enumerate(_chars)}
|
||
|
|
||
|
|
||
|
def to_english(array: npt.NDArray[np.int64]) -> 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}")
|
||
|
|