Compare commits

..
Author SHA1 Message Date
adam efa709e34e add online mode flag to help message
Deploy game to server / deploy (push) Successful in 8s
2025-11-23 21:22:10 +00:00
adam a7cdb712fd fix typo in function name
Deploy game to server / deploy (push) Successful in 7s
2025-09-27 21:14:39 +00:00
adam 75074d8e84 add stats url to online mode
Deploy game to server / deploy (push) Successful in 7s
2025-08-28 09:59:26 +00:00
adam 3487adf34c exit save_result if not in online mode
Deploy game to server / deploy (push) Successful in 30s
2025-04-23 21:22:03 +00:00
adam 2194d495e6 extra file for current board
Deploy game to server / deploy (push) Successful in 42s
2025-03-03 12:07:43 +00:00
adam 005a129919 change help message format
Deploy game to server / deploy (push) Successful in 6s
2025-02-22 20:00:30 +00:00
adam bdb3d4e4d1 Move signal trap initialization after game mode questions - Prevent progress files after incorrect username 2025-02-22 19:41:46 +00:00
adam 6bbcc5229b save progress at start of a game 2025-02-22 19:38:06 +00:00
adam 4029c00edc remove $ where not needed 2025-02-22 19:22:45 +00:00
adam 8327678209 only show board on daily win
Deploy game to server / deploy (push) Successful in 6s
2025-02-21 13:21:04 +00:00
adam d496319361 Add guess count out of 6 on win
Deploy game to server / deploy (push) Successful in 7s
2025-02-21 13:12:19 +00:00
adam 107fd30b00 print spoiler free board after a game 2025-02-21 13:07:03 +00:00
adam 0a5d0be050 change spacing on math
Deploy game to server / deploy (push) Successful in 7s
2025-02-20 12:50:17 +00:00
adam 357c74cf08 calculate average guesses and fix divide by 0 bug
Deploy game to server / deploy (push) Successful in 8s
2025-02-16 17:05:57 +00:00
adam e138f71a62 start games played at 0
Deploy game to server / deploy (push) Successful in 6s
2025-02-14 16:31:02 +00:00
adam 064b85aac2 add 1 to graph axis to match number of guesses
Deploy game to server / deploy (push) Successful in 7s
2025-02-14 16:27:01 +00:00
adam fba5cc07ae fix pool issue bug
Deploy game to server / deploy (push) Successful in 5s
2025-02-14 16:14:31 +00:00
adam ce2a14fbe6 track stat
Deploy game to server / deploy (push) Successful in 6s
2025-02-14 16:00:39 +00:00
+140 -41
View File
@@ -6,6 +6,7 @@ declare -gr HEIGHT=6
declare -gr LETTER=$'\e[97m' declare -gr LETTER=$'\e[97m'
declare -gr GREY=$'\e[48;5;8m' declare -gr GREY=$'\e[48;5;8m'
declare -gr GREEN=$'\e[48;5;10m' declare -gr GREEN=$'\e[48;5;10m'
declare -gr LETTER_GR=$'\e[32m'
declare -gr YELLOW=$'\e[48;5;3m' declare -gr YELLOW=$'\e[48;5;3m'
declare -gr RESET=$'\e[0m' declare -gr RESET=$'\e[0m'
declare -gr BOLD=$'\e[1m' declare -gr BOLD=$'\e[1m'
@@ -22,7 +23,6 @@ declare -gr UP1=$'\e[1F'
declare -gr HIDE_CURSOR=$'\e[?25l' declare -gr HIDE_CURSOR=$'\e[?25l'
declare -gr SHOW_CURSOR=$'\e[?25h' declare -gr SHOW_CURSOR=$'\e[?25h'
declare -gr GOHOME=$'\e[H' declare -gr GOHOME=$'\e[H'
declare -gr DOWN1=$'\e[1E'
declare -gr INDENT=$'\e[1C' declare -gr INDENT=$'\e[1C'
function main() { function main() {
@@ -50,12 +50,14 @@ function main() {
init_board init_board
fi fi
[[ "${ONLINE}" == 1 ]] && save_game "NO_EXIT"
render_board render_board
for (( ROW; ROW<HEIGHT; ROW++ )); do for (( ROW; ROW<HEIGHT; ROW++ )); do
declare GUESS declare GUESS
[[ "${KEYBOARD}" == 1 ]] && render_keyboard [[ "${KEYBOARD}" == 1 ]] && render_keyboard
GUESS=$(retrive_guess) GUESS=$(retrieve_guess)
check_guess "${GUESS}" "${ROW}" ; WIN=$? check_guess "${GUESS}" "${ROW}" ; WIN=$?
reveal_row "${ROW}" reveal_row "${ROW}"
@@ -63,7 +65,12 @@ function main() {
if [[ $WIN == 5 ]]; then if [[ $WIN == 5 ]]; then
save_result save_result
echo -e "${CLEAR_DOWN}YOU WIN" echo -e "${CLEAR_DOWN}YOU WIN"
[[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]] && echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\"" if [[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]]; then
echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\""
echo "Share/view your stats with -> curl \"${URL_BASE}/stats/${USER}\""
while read -r board_line; do echo "${board_line//[A-Z]/ }"; done < "${RESULT_FILE}"
fi
echo "Guess - $(( ROW+1 ))/6"
exit 0 exit 0
fi fi
done done
@@ -76,7 +83,11 @@ function main() {
echo -en "${NEWLINE}${RESET}" echo -en "${NEWLINE}${RESET}"
save_result save_result
[[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]] && echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\"" if [[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]]; then
echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\""
echo "Share/view your stats with -> curl \"${URL_BASE}/stats/${USER}\""
while read -r board_line; do echo "${board_line//[A-Z]/ }"; done < "${RESULT_FILE}"
fi
exit 0 exit 0
} }
@@ -130,18 +141,18 @@ function set_options() {
USER="${USER,,}" USER="${USER,,}"
declare -g DAY declare -g DAY
DAY=$(( $EPOCHSECONDS / 86400 )) DAY=$(( EPOCHSECONDS / 86400 ))
declare -gr PROGRESS_FILE=".${USER}-${DAY}.progress" declare -gr PROGRESS_FILE=".${USER}-${DAY}.progress"
declare -gr RESULT_FILE="${USER}-${DAY}.board" declare -gr RESULT_FILE="${USER}-${DAY}.board"
declare -gr CUR_RESULT_FILE="${USER}.board"
declare -gr STATS_SOURCE=".${USER}.stats" declare -gr STATS_SOURCE=".${USER}.stats"
declare -gr STATS_FILE="${USER}.stats" declare -gr STATS_FILE="${USER}.stats"
trap save_game SIGINT
if [[ -f "${PROGRESS_FILE}" ]] && [[ -s "${PROGRESS_FILE}" ]]; then if [[ -f "${PROGRESS_FILE}" ]] && [[ -s "${PROGRESS_FILE}" ]]; then
load_game load_game
RESUME=1 RESUME=1
@@ -155,26 +166,30 @@ function set_options() {
if [[ "${HM}" =~ ^[Yy]$ ]]; then if [[ "${HM}" =~ ^[Yy]$ ]]; then
HARD_MODE=1 HARD_MODE=1
declare SHM
echo -en "${NEWLINE}" echo -en "${NEWLINE}"
read -r -p "Do you want to enable strict hard mode [y/N]? " -n 1 HM read -r -p "Do you want to enable strict hard mode [y/N]? " -n 1 HM
[[ "${HM}" =~ ^[Yy]$ ]] && STRICT_HARD_MODE=1 [[ "${HM}" =~ ^[Yy]$ ]] && STRICT_HARD_MODE=1
fi fi
fi fi
trap save_game SIGINT
;; ;;
d) d)
DELAY=0 DELAY=0
;; ;;
h) h)
echo -e "Usage: <program_name> [OPTIONS] echo -e \
"Usage: <program_name> [OPTIONS]
Play a game for Wordle Play a game for Wordle
Options: Options:
-b Toggle borderless mode -b Toggle borderless mode
-w Set target word -w Set target word
-H Enable hard mode -H Enable hard mode
-S Enable strict hard mode (Cannot reuse grey letters) -S Enable strict hard mode (Cannot reuse grey letters)
-k disable on screen keyboard -k disable on screen keyboard
-o Enable online mode
-d Enable debug mode (no delay during letter reveal) -d Enable debug mode (no delay during letter reveal)
-h Show this help message and exit" -h Show this help message and exit"
@@ -213,7 +228,7 @@ function render_board() {
[[ "${BORDER}" == 1 ]] && echo -e "└─────────────────┘" [[ "${BORDER}" == 1 ]] && echo -e "└─────────────────┘"
} }
function retrive_guess() { function retrieve_guess() {
if [[ -n $1 ]]; then if [[ -n $1 ]]; then
read -r -p "${CLEAR_UP1}$1: " GUESS read -r -p "${CLEAR_UP1}$1: " GUESS
else else
@@ -226,12 +241,12 @@ function retrive_guess() {
declare valid_guess declare valid_guess
validate_guess "${GUESS}" ; valid_guess=$? validate_guess "${GUESS}" ; valid_guess=$?
[[ ${valid_guess} == 1 ]] && GUESS=$(retrive_guess "Not A Valid Word") [[ ${valid_guess} == 1 ]] && GUESS=$(retrieve_guess "Not A Valid Word")
[[ ${valid_guess} == 2 ]] && GUESS=$(retrive_guess "Not A Valid Guess") [[ ${valid_guess} == 2 ]] && GUESS=$(retrieve_guess "Not A Valid Guess")
[[ ${valid_guess} == 3 ]] && GUESS=$(retrive_guess "GREEN Issue") [[ ${valid_guess} == 3 ]] && GUESS=$(retrieve_guess "GREEN Issue")
[[ ${valid_guess} == 4 ]] && GUESS=$(retrive_guess "YELLOW Issue") [[ ${valid_guess} == 4 ]] && GUESS=$(retrieve_guess "YELLOW Issue")
[[ ${valid_guess} == 5 ]] && GUESS=$(retrive_guess "POOL Issue") [[ ${valid_guess} == 5 ]] && GUESS=$(retrieve_guess "POOL Issue")
[[ ${valid_guess} == 6 ]] && GUESS=$(retrive_guess "NEW Issue") [[ ${valid_guess} == 6 ]] && GUESS=$(retrieve_guess "NEW Issue")
echo -n "${GUESS^^}" echo -n "${GUESS^^}"
} }
@@ -326,7 +341,7 @@ function check_guess() {
YELLOWS[$_row,$c]="${_char}" # stores all yellow from all rounds YELLOWS[$_row,$c]="${_char}" # stores all yellow from all rounds
BOARD[$_row,$c]="${YELLOW}${BOLD}${LETTER} ${_char} ${UNBOLD}" BOARD[$_row,$c]="${YELLOW}${BOLD}${LETTER} ${_char} ${UNBOLD}"
fi fi
[[ "${ANSWER}" =~ ${_char} ]] && continue
[[ " ${yellows[*]} " =~ ${_char} ]] && continue [[ " ${yellows[*]} " =~ ${_char} ]] && continue
[[ " ${greens[*]} " =~ ${_char} ]] && continue [[ " ${greens[*]} " =~ ${_char} ]] && continue
POOL="${POOL/${_char}/_}" POOL="${POOL/${_char}/_}"
@@ -351,11 +366,13 @@ function reveal_row() {
} }
function load_game() { function load_game() {
# shellcheck source=/dev/null
source "${PROGRESS_FILE}" source "${PROGRESS_FILE}"
} }
# shellcheck disable=SC2317 # Don't warn about unreachable commands in this function
function save_game() { function save_game() {
> "${PROGRESS_FILE}" : > "${PROGRESS_FILE}"
for key in "${!BOARD[@]}"; do for key in "${!BOARD[@]}"; do
echo "BOARD[$key]='${BOARD[$key]}'" >> "${PROGRESS_FILE}" echo "BOARD[$key]='${BOARD[$key]}'" >> "${PROGRESS_FILE}"
@@ -365,29 +382,36 @@ function save_game() {
echo "YELLOWS[$key]='${YELLOWS[$key]}'" >> "${PROGRESS_FILE}" echo "YELLOWS[$key]='${YELLOWS[$key]}'" >> "${PROGRESS_FILE}"
done done
echo "ROW=${ROW}" >> "${PROGRESS_FILE}" {
echo "POOL=${POOL}" >> "${PROGRESS_FILE}" echo "ROW=${ROW}"
echo "HARD_MODE=${HARD_MODE}" >> "${PROGRESS_FILE}" echo "POOL=${POOL}"
echo "STRICT_HARD_MODE=${STRICT_HARD_MODE}" >> "${PROGRESS_FILE}" echo "HARD_MODE=${HARD_MODE}"
echo "WIN=${WIN}" >> "${PROGRESS_FILE}" echo "STRICT_HARD_MODE=${STRICT_HARD_MODE}"
echo "ANSWER=${ANSWER}" >> "${PROGRESS_FILE}" echo "WIN=${WIN}"
echo "IN_PROGRESS=1" >> "${PROGRESS_FILE}" echo "ANSWER=${ANSWER}"
[[ "${PLAYED}" == 1 ]] && echo 'PLAYED=1' >> "${PROGRESS_FILE}" echo "IN_PROGRESS=1"
[[ "${PLAYED}" == 1 ]] && echo 'PLAYED=1'
} >> "${PROGRESS_FILE}"
echo -en "${RESET}" echo -en "${RESET}"
exit 0 [[ -z $1 ]] && exit 0
} }
function save_result() { function save_result() {
[[ "${ONLINE}" == 0 ]] && return 0
[[ "${ONLINE}" == 1 ]] && update_stats [[ "${ONLINE}" == 1 ]] && update_stats
if [[ "${ONLINE}" == 1 ]] && [[ "${DAILY_DONE}" != 1 ]]; then if [[ "${ONLINE}" == 1 ]] && [[ "${DAILY_DONE}" != 1 ]]; then
render_board > "${RESULT_FILE}" render_board > "${RESULT_FILE}"
render_board > "${CUR_RESULT_FILE}"
if [[ $WIN != 5 ]]; then if [[ $WIN != 5 ]]; then
[[ "${BORDER}" == 1 ]] && echo -en "${CLEAR_DOWN}${INDENT}${INDENT}" >> "${RESULT_FILE}" [[ "${BORDER}" == 1 ]] && echo -en "${CLEAR_DOWN}${INDENT}${INDENT}" >> "${RESULT_FILE}"
echo -en "${CLEAR_LINE}${BOLD}" >> "${RESULT_FILE}" echo -en "${CLEAR_LINE}${BOLD}" >> "${RESULT_FILE}"
for (( i=0; i<WIDTH; i++ )); do for (( i=0; i<WIDTH; i++ )); do
echo -en " ${ANSWER:$i:1} " >> "${RESULT_FILE}" echo -en " ${ANSWER:$i:1} " >> "${RESULT_FILE}"
echo -en " ${ANSWER:$i:1} " >> "${CUR_RESULT_FILE}"
done done
echo -en "${NEWLINE}${RESET}" >> "${RESULT_FILE}" echo -en "${NEWLINE}${RESET}" >> "${RESULT_FILE}"
echo -en "${NEWLINE}${RESET}" >> "${CUR_RESULT_FILE}"
fi fi
fi fi
echo 'PLAYED=1' > "${PROGRESS_FILE}" echo 'PLAYED=1' > "${PROGRESS_FILE}"
@@ -395,9 +419,11 @@ function save_result() {
function update_stats() { function update_stats() {
if [[ -f "${STATS_SOURCE}" ]]; then if [[ -f "${STATS_SOURCE}" ]]; then
# shellcheck source=/dev/null
source "${STATS_SOURCE}" source "${STATS_SOURCE}"
else else
create_stats create_stats
# shellcheck source=/dev/null
source "${STATS_SOURCE}" source "${STATS_SOURCE}"
fi fi
@@ -407,27 +433,100 @@ function update_stats() {
[[ $WIN == 5 ]] && SCORE="${GAME_HIST[$ROW]}" [[ $WIN == 5 ]] && SCORE="${GAME_HIST[$ROW]}"
[[ $WIN == 5 ]] && SCORE=$(( SCORE+1 )) [[ $WIN == 5 ]] && SCORE=$(( SCORE+1 ))
[[ $WIN == 5 ]] && GAME_HIST[$ROW]="${SCORE}" [[ $WIN == 5 ]] && GAME_HIST[ROW]="${SCORE}"
[[ $WIN == 5 ]] && STREAK=$(( STREAK+1 )) [[ $WIN == 5 ]] && STREAK=$(( STREAK+1 ))
[[ $WIN != 5 ]] && STREAK=0 [[ $WIN != 5 ]] && STREAK=0
[[ $LONGEST_STREAK < $STREAK ]] && LONGEST_STREAK=$(( LONGEST_STREAK+1 )) [[ $LONGEST_STREAK -lt $STREAK ]] && LONGEST_STREAK=$(( LONGEST_STREAK+1 ))
> "${STATS_SOURCE}" declare num=0
echo "GAMES_PLAYED=${GAMES_PLAYED}" >> "${STATS_SOURCE}" declare den=0
echo "WINS=${WINS}" >> "${STATS_SOURCE}" for (( i=0; i<${#GAME_HIST[@]}; i++)); do
echo "LOSSES=${LOSSES}" >> "${STATS_SOURCE}" (( den += ${GAME_HIST[$i]} ))
echo "GAME_HIST=(${GAME_HIST[*]})" >> "${STATS_SOURCE}" (( num += ${GAME_HIST[$i]}*(i+1) ))
echo "STREAK=${STREAK}" >> "${STATS_SOURCE}"
echo "LONGEST_STREAK=${LONGEST_STREAK}" >> "${STATS_SOURCE}" done
if [[ "${den}" != 0 ]]; then
result=$(( (num * 100) / den ))
integer_part=$(( result / 100 ))
decimal_part=$(( result % 100 ))
AVERAGE="${integer_part}.${decimal_part}"
fi
: > "${STATS_SOURCE}"
{
echo "GAMES_PLAYED=${GAMES_PLAYED}"
echo "WINS=${WINS}"
echo "LOSSES=${LOSSES}"
echo "GAME_HIST=(${GAME_HIST[*]})"
echo "STREAK=${STREAK}"
echo "LONGEST_STREAK=${LONGEST_STREAK}"
echo "AVERAGE=${AVERAGE}"
} >> "${STATS_SOURCE}"
render_stats
} }
function create_stats() { function create_stats() {
echo "GAMES_PLAYED=1" >> "${STATS_SOURCE}" {
echo -e "WINS=0\\nLOSSES=0" >> "${STATS_SOURCE}" echo "GAMES_PLAYED=0"
echo "GAME_HIST=(0 0 0 0 0 0)" >> "${STATS_SOURCE}" echo "WINS=0"
echo "STREAK=0" >> "${STATS_SOURCE}" echo "LOSSES=0"
echo "LONGEST_STREAK=0" >> "${STATS_SOURCE}" echo "GAME_HIST=(0 0 0 0 0 0)"
echo "STREAK=0"
echo "LONGEST_STREAK=0"
echo "AVERAGE=0"
} >> "${STATS_SOURCE}"
}
function render_stats() {
[[ -f "${STATS_SOURCE}" ]] || return
# shellcheck source=/dev/null
# https://www.shellcheck.net/wiki/SC1091 https://www.shellcheck.net/wiki/SC1090
source "${STATS_SOURCE}"
declare highest=0
declare -r max_width=20
declare axis
for (( i=0; i<HEIGHT; i++ )); do
[[ "${GAME_HIST[$i]}" -gt "${highest}" ]] && highest="${GAME_HIST[$i]}"
done
for (( i=0; i<HEIGHT; i++ )); do
value="${GAME_HIST[$i]}"
if [[ "${highest}" == 0 ]]; then
bar_length=0
else
bar_length=$(( value * max_width / highest ))
fi
bar='▇'
for (( j=0; j<bar_length; j++)); do
bar+='▇'
done
axis=$(( i+1 ))
if [[ "${ROW}" == "${i}" ]]; then
echo "$axis│${LETTER_GR}$bar${RESET} $value"
else
echo "$axis│$bar $value"
fi
done > "${STATS_FILE}"
{
echo
echo "Played: ${GAMES_PLAYED}"
echo "Wins: ${WINS}"
echo "Losses: ${LOSSES}"
echo "Streak: ${STREAK}"
echo "Longest Streak: ${LONGEST_STREAK}"
echo "Average: ${AVERAGE}"
} >> "${STATS_FILE}"
} }
declare -gr VALID_GUESSES="aahed aalii aapas aargh aarti abaca abaci aback abacs abaft abaht abaka abamp aband abase abash abask abate abaya abbas abbed abbes abbey abbot abcee abeam abear abeat abeer abele abeng abers abets abeys abhor abide abies abius abjad abjud abled abler ables ablet ablow abmho abnet abode abohm aboil aboma aboon abord abore aborn abort about above abram abray abrim abrin abris absey absit abuna abune abura aburn abuse abuts abuzz abyes abysm abyss acais acara acari accas accha accoy accra acedy acene acerb acers aceta achar ached acher aches achey achoo acids acidy acies acing acini ackee acker acmes acmic acned acnes acock acoel acold acone acorn acral acred acres acrid acron acros acryl actas acted actin acton actor actus acute acyls adage adapt adats adawn adaws adays adbot addas addax added adder addin addio addle addra adead adeem adept adhan adhoc adieu adios adits adlib adman admen admin admit admix adnex adobe adobo adoon adopt adorb adore adorn adown adoze adrad adraw adred adret adrip adsum aduki adult adunc adust advew advts adyta adyts adzed adzes aecia aedes aeger aegis aeons aerie aeros aesir aevum afald afanc afara afars afear affix affly afion afire afizz aflaj aflap aflow afoam afoot afore afoul afret afrit afros after aftos again agals agama agami agamy agape agars agasp agast agate agaty agave agaze agbas agene agent agers aggag agger aggie aggri aggro aggry aghas agidi agila agile aging agios agism agist agita aglee aglet agley agloo aglow aglus agmas agoge agogo agone agons agony agood agora agree agria agrin agros agrum agued agues aguey aguna agush aguti ahead aheap ahent ahigh ahind ahing ahint ahold ahole ahull ahuru aidas aided aider aides aidoi aidos aiery aigas aight ailed aimag aimak aimed aimer ainee ainga aioli aired airer airns airth airts aisle aitch aitus aiver aixes aiyah aiyee aiyoh aiyoo aizle ajies ajiva ajuga ajupa ajwan akara akees akela akene aking akita akkas akker akoia akoja akoya aksed akses alaap alack alala alamo aland alane alang alans alant alapa alaps alarm alary alata alate alays albas albee albid album alcea alces alcid alcos aldea alder aldol aleak aleck alecs aleem alefs aleft aleph alert alews aleye alfas algae algal algas algid algin algor algos algum alias alibi alick alien alifs align alike alims aline alios alist alive aliya alkie alkin alkos alkyd alkyl allan allay allee allel allen aller alley allin allis allod allot allow alloy allus allyl almah almas almeh almes almud almug alods aloed aloes aloft aloha aloin alone along aloof aloos alose aloud alowe alpha altar alter altho altos alula alums alumy alure alurk alvar alway amahs amain amari amaro 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 ammas ammon ammos amnia amnic amnio amoks amole among amore amort amour amove amowt amped ample amply ampul amrit amuck amuse amyls anana anata ancho ancle ancon andic 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 annan annas annat annex annoy annul annum annus anoas anode anole anomy ansae ansas 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 apols apoop aport appal appam appay appel apple apply appro appts appui appuy apres apron apses apsis apsos apted apter aptly aquae aquas araba araks arame arars arbah 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 arith arked arled arles armed armer armet armil armor arnas arnis arnut aroba aroha aroid aroma arose arpas arpen arrah arras array arret arris arrow arroz arsed arses arsey arsis arson artal artel arter artic artis artly artsy aruhe arums arval arvee arvos aryls asada asana ascon ascot ascus asdic ashed ashen ashes ashet aside asity askar asked asker askew askoi askos aspen asper aspic aspie aspis aspro assai assam assay assed 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 attas atter attic atuas aucht audad audax audio audit augen auger auges 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 awari awarn awash awato awave aways awdls aweel aweto awful awing awkin awmry awned awner awoke awols awork axels axiaLine truncated declare -gr VALID_GUESSES="aahed aalii aapas aargh aarti abaca abaci aback abacs abaft abaht abaka abamp aband abase abash abask abate abaya abbas abbed abbes abbey abbot abcee abeam abear abeat abeer abele abeng abers abets abeys abhor abide abies abius abjad abjud abled abler ables ablet ablow abmho abnet abode abohm aboil aboma aboon abord abore aborn abort about above abram abray abrim abrin abris absey absit abuna abune abura aburn abuse abuts abuzz abyes abysm abyss acais acara acari accas accha accoy accra acedy acene acerb acers aceta achar ached acher aches achey achoo acids acidy acies acing acini ackee acker acmes acmic acned acnes acock acoel acold acone acorn acral acred acres acrid acron acros acryl actas acted actin acton actor actus acute acyls adage adapt adats adawn adaws adays adbot addas addax added adder addin addio addle addra adead adeem adept adhan adhoc adieu adios adits adlib adman admen admin admit admix adnex adobe adobo adoon adopt adorb adore adorn adown adoze adrad adraw adred adret adrip adsum aduki adult adunc adust advew advts adyta adyts adzed adzes aecia aedes aeger aegis aeons aerie aeros aesir aevum afald afanc afara afars afear affix affly afion afire afizz aflaj aflap aflow afoam afoot afore afoul afret afrit afros after aftos again agals agama agami agamy agape agars agasp agast agate agaty agave agaze agbas agene agent agers aggag agger aggie aggri aggro aggry aghas agidi agila agile aging agios agism agist agita aglee aglet agley agloo aglow aglus agmas agoge agogo agone agons agony agood agora agree agria agrin agros agrum agued agues aguey aguna agush aguti ahead aheap ahent ahigh ahind ahing ahint ahold ahole ahull ahuru aidas aided aider aides aidoi aidos aiery aigas aight ailed aimag aimak aimed aimer ainee ainga aioli aired airer airns airth airts aisle aitch aitus aiver aixes aiyah aiyee aiyoh aiyoo aizle ajies ajiva ajuga ajupa ajwan akara akees akela akene aking akita akkas akker akoia akoja akoya aksed akses alaap alack alala alamo aland alane alang alans alant alapa alaps alarm alary alata alate alays albas albee albid album alcea alces alcid alcos aldea alder aldol aleak aleck alecs aleem alefs aleft aleph alert alews aleye alfas algae algal algas algid algin algor algos algum alias alibi alick alien alifs align alike alims aline alios alist alive aliya alkie alkin alkos alkyd alkyl allan allay allee allel allen aller alley allin allis allod allot allow alloy allus allyl almah almas almeh almes almud almug alods aloed aloes aloft aloha aloin alone along aloof aloos alose aloud alowe alpha altar alter altho altos alula alums alumy alure alurk alvar alway amahs amain amari amaro 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 ammas ammon ammos amnia amnic amnio amoks amole among amore amort amour amove amowt amped ample amply ampul amrit amuck amuse amyls anana anata ancho ancle ancon andic 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 annan annas annat annex annoy annul annum annus anoas anode anole anomy ansae ansas 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 apols apoop aport appal appam appay appel apple apply appro appts appui appuy apres apron apses apsis apsos apted apter aptly aquae aquas araba araks arame arars arbah 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 arith arked arled arles armed armer armet armil armor arnas arnis arnut aroba aroha aroid aroma arose arpas arpen arrah arras array arret arris arrow arroz arsed arses arsey arsis arson artal artel arter artic artis artly artsy aruhe arums arval arvee arvos aryls asada asana ascon ascot ascus asdic ashed ashen ashes ashet aside asity askar asked asker askew askoi askos aspen asper aspic aspie aspis aspro assai assam assay assed 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 attas atter attic atuas aucht audad audax audio audit augen auger auges 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 awari awarn awash awato awave aways awdls aweel aweto awful awing awkin awmry awned awner awoke awols awork axels axiaLine truncated