#!/bin/bash
#
# arguments:
#
# none -> will get official Wordle past answers (once a day) AND give a seed word from the possible answers
#
# -o -> official Wordle: will consider past answers
#
# w-o+r*d-s- -> include hints from 'words':
# '-': previous letter not included
# '+': previous letter at the right place
# '*': previous letter included but not at the right place
#
# include as many words as necessary.
#
# Example:
#
# - wordle.sh
# - wordle.sh c-i-g-a*r*
# - wordle.sh -o c-i-g-a*r*
# - wordle.sh c-i-g-a*r* a*p-a*r+t-
# - wordle.sh -o c-i-g-a*r* a*p-a*r+t-
#
if [ $# = 0 ]
then
fileDate=$(
if [ -f past-answers.html ]
then
echo $(date -r past-answers.html | sed -E 's/^(([^ ]+ ){4}).+/\1/')
else
echo ''
echo '' > past-answers.html
fi
)
today=$(date | sed -E 's/^(([^ ]+ ){4}).+/\1/')
if [ "$fileDate" != "$today" ]
then
_wget_ -q -O past-answers.html https://www.fiveforks.com/wordle/
fi
xmllint --html --xpath "//div[@id='vlist']" past-answers.html 2> /dev/null | sed -E 's/<[^>]+>//g' | sed -E 's/^(.{5}).+/\1/g' | sed -e '1,2d' | tr A-Z a-z > past-answers.txt
comm -13 <(sort past-answers.txt) <(sort answerlist.txt) > futureanswerlist.txt
shuf -n 1 futureanswerlist.txt
exit
fi
FIRST=''
SECOND=''
THIRD=''
FOURTH=''
FIFTH=''
SOMEWHERE=''
NOT_FIRST=''
NOT_SECOND=''
NOT_THIRD=''
NOT_FOURTH=''
NOT_FIFTH=''
NOWHERE=''
future=''
for word in "$@"
do
if [ $word = '-o' ]
then
future='future'
else
echo $word
for ((i=0; i<${#word}; i+=2))
do
j=$((i+1))
if [ "${word:j:1}" = '-' ]
then
NOWHERE="$NOWHERE${word:i:1}"
elif [ "${word:j:1}" = '+' ]
then
case $i in
0)
FIRST="${word:i:1}"
;;
2)
SECOND="${word:i:1}"
;;
4)
THIRD="${word:i:1}"
;;
6)
FOURTH="${word:i:1}"
;;
8)
FIFTH="${word:i:1}"
;;
esac
elif [ "${word:j:1}" = '*' ]
then
SOMEWHERE="$SOMEWHERE${word:i:1}"
case $i in
0)
NOT_FIRST="$NOT_FIRST${word:i:1}"
;;
2)
NOT_SECOND="$NOT_SECOND${word:i:1}"
;;
4)
NOT_THIRD="$NOT_THIRD${word:i:1}"
;;
6)
NOT_FOURTH="$NOT_FOURTH${word:i:1}"
;;
8)
NOT_FIFTH="$NOT_FIFTH${word:i:1}"
;;
esac
fi
done
fi
done
function set_unique {
SET=$1
TEMP=''
for letters in "${SET[@]}"
do
declare -A char_count
for ((i=0; i<${#letters}; i++))
do
char=${letters:i:1}
char_count["$char"]=1
done
for char in "${!char_count[@]}"
do
TEMP=$TEMP$char
done
unset char_count
done
echo $TEMP
}
SOMEWHERE=$(set_unique "$SOMEWHERE")
NOWHERE=$(set_unique "$NOWHERE")
NOT_FIRST=$(set_unique "$NOT_FIRST")
NOT_SECOND=$(set_unique "$NOT_SECOND")
NOT_THIRD=$(set_unique "$NOT_THIRD")
NOT_FOURTH=$(set_unique "$NOT_FOURTH")
NOT_FIFTH=$(set_unique "$NOT_FIFTH")
echo $FIRST '-' $SECOND '-' $THIRD '-' $FOURTH '-' $FIFTH
echo $SOMEWHERE
echo $NOT_FIRST '-' $NOT_SECOND '-' $NOT_THIRD '-' $NOT_FOURTH '-' $NOT_FIFTH
echo $NOWHERE
echo '-----'
#---------------------#
somewhere=''
if [ $SOMEWHERE ]
then
for ((i=0; i<${#SOMEWHERE}; i++))
do
somewhere="$somewhere(?=.*${SOMEWHERE:i:1}.*)"
done
for ((i=0; i<${#NOT_FIRST}; i++))
do
somewhere="$somewhere(?=[^${NOT_FIRST:i:1}].{4})"
done
for ((i=0; i<${#NOT_SECOND}; i++))
do
somewhere="$somewhere(?=.[^${NOT_SECOND:i:1}].{3})"
done
for ((i=0; i<${#NOT_THIRD}; i++))
do
somewhere="$somewhere(?=..[^${NOT_THIRD:i:1}]..)"
done
for ((i=0; i<${#NOT_FOURTH}; i++))
do
somewhere="$somewhere(?=.{3}[^${NOT_FOURTH:i:1}].)"
done
for ((i=0; i<${#NOT_FIFTH}; i++))
do
somewhere="$somewhere(?=.{4}[^${NOT_FIFTH:i:1}])"
done
fi
if [ $FIRST ]
then
first=$FIRST
elif [ $NOWHERE ]
then
first="[^$NOWHERE]"
else
first="."
fi
if [ $SECOND ]
then
second=$SECOND
elif [ $NOWHERE ]
then
second="[^$NOWHERE]"
else
second="."
fi
if [ $THIRD ]
then
third=$THIRD
elif [ $NOWHERE ]
then
third="[^$NOWHERE]"
else
third="."
fi
if [ $FOURTH ]
then
fourth=$FOURTH
elif [ $NOWHERE ]
then
fourth="[^$NOWHERE]"
else
fourth="."
fi
if [ $FIFTH ]
then
fifth=$FIFTH
elif [ $NOWHERE ]
then
fifth="[^$NOWHERE]"
else
fifth="."
fi
grep -P "$somewhere$first$second$third$fourth$fifth" ${future}answerlist.txt > possible-answers.txt
cat possible-answers.txt | wc -l
cat possible-answers.txt | head -n20
echo "-----"
DONE="$SOMEWHERE$NOWHERE$FIRST$SECOND$THIRD$FOURTH$FIFTH"
sed "s/[$DONE]//g" possible-answers.txt > possible-answers-letters.txt
ALPHABET="abcdefghijklmnopqrstuvwxyz"
echo $ALPHABET | sed "s/[$DONE]//g" | grep -o . > remaining-letters.txt
mapfile -t POSSIBLE < possible-answers-letters.txt
mapfile -t REMAINING < remaining-letters.txt
declare -A count
for ((i=0; i<${#REMAINING}; i++))
do
char=${REMAINING:i:1}
count["$char"]=0
done
for remaining in "${POSSIBLE[@]}"
do
declare -A char_count
for ((i=0; i<${#remaining}; i++))
do
char=${remaining:i:1}
char_count["$char"]=1
done
for char in "${!char_count[@]}"
do
count["$char"]=$((count["$char"] + 1))
done
unset char_count
done
for char in "${!count[@]}"
do
if [ ${count["$char"]} = 0 ]; then unset count["$char"]; fi
done
LENGTH=${#count[@]}
if [ $LENGTH -gt 5 ]; then LENGTH=5; fi
NEW_LETTERS=$(
for char in "${!count[@]}"
do
echo $char '-' ${count["$char"]}
done |
sort -rn -k3 |
head -n$LENGTH |
sed -E "s/(.).+/\1/" |
tr -d "\n"
)
for ((i=0; i<${#NEW_LETTERS}; i++))
do
new_letters="$new_letters(?=.*${NEW_LETTERS:i:1}.*)"
done
NEXT=$(grep -P "$new_letters....." possible-answers.txt | head -n10)
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." ${future}answerlist.txt | head -n10)
fi
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." wordlist.txt | head -n10)
fi
if [[ $NEXT ]]
then
echo $NEXT
exit
else
LENGTH=$(( $LENGTH - 1 ))
NEW_LETTERS=$(
for char in "${!count[@]}"
do
echo $char '-' ${count["$char"]}
done |
sort -rn -k3 |
head -n$LENGTH |
sed -E "s/(.).+/\1/" |
tr -d "\n"
)
new_letters=''
for ((i=0; i<${#NEW_LETTERS}; i++))
do
new_letters="$new_letters(?=.*${NEW_LETTERS:i:1}.*)"
done
NEXT=$(grep -P "$new_letters....." possible-answers.txt | head -n10)
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." ${future}answerlist.txt | head -n10)
fi
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." wordlist.txt | head -n10)
fi
fi
if [[ $NEXT ]]
then
echo $NEXT
exit
else
LENGTH=$(( $LENGTH - 1 ))
NEW_LETTERS=$(
for char in "${!count[@]}"
do
echo $char '-' ${count["$char"]}
done |
sort -rn -k3 |
head -n$LENGTH |
sed -E "s/(.).+/\1/" |
tr -d "\n"
)
new_letters=''
for ((i=0; i<${#NEW_LETTERS}; i++))
do
new_letters="$new_letters(?=.*${NEW_LETTERS:i:1}.*)"
done
NEXT=$(grep -P "$new_letters....." possible-answers.txt | head -n10)
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." ${future}answerlist.txt | head -n10)
fi
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." wordlist.txt | head -n10)
fi
fi
if [[ $NEXT ]]
then
echo $NEXT
exit
else
LENGTH=$(( $LENGTH - 1 ))
NEW_LETTERS=$(
for char in "${!count[@]}"
do
echo $char '-' ${count["$char"]}
done |
sort -rn -k3 |
head -n$LENGTH |
sed -E "s/(.).+/\1/" |
tr -d "\n"
)
new_letters=''
for ((i=0; i<${#NEW_LETTERS}; i++))
do
new_letters="$new_letters(?=.*${NEW_LETTERS:i:1}.*)"
done
NEXT=$(grep -P "$new_letters....." possible-answers.txt | head -n10)
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." ${future}answerlist.txt | head -n10)
fi
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." wordlist.txt | head -n10)
fi
fi
if [[ $NEXT ]]
then
echo $NEXT
exit
else
LENGTH=$(( $LENGTH - 1 ))
NEW_LETTERS=$(
for char in "${!count[@]}"
do
echo $char '-' ${count["$char"]}
done |
sort -rn -k3 |
head -n$LENGTH |
sed -E "s/(.).+/\1/" |
tr -d "\n"
)
new_letters=''
for ((i=0; i<${#NEW_LETTERS}; i++))
do
new_letters="$new_letters(?=.*${NEW_LETTERS:i:1}.*)"
done
NEXT=$(grep -P "$new_letters....." possible-answers.txt | head -n10)
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." ${future}answerlist.txt | head -n10)
fi
if [[ ! $NEXT ]]
then
NEXT=$(grep -P "$new_letters....." wordlist.txt | head -n10)
fi
echo $NEXT
exit
fi