I've been on Facebook for a while, and like everyone else, I started playing scramble, a boggle like game. Well, I'm not very good, and got tired of getting beat. There must be an easier way !
In my professional life I support people using barcode scanners. Now, the scanners we use now usualy pretend to be a keyboard over usb. Older ones used serial communication and a piece of software called a 'wedge' to feed the input from the serial port to the keyboard, so I came up with the most complicated solution I could. Our desktop PC running Windoze and a serial to keyboard wedge. My Linux laptop would run a batch script and echo the results over a null modem cable to the Windows PC serial port where the text gets piped to the keyboard and plays the game.
Here's my script;
| #!/bin/bash                    #                              # scramble2.sh                 #                              # This script generate 6,5,4 and 3 letter words # from /usr/src/dict/words fro cheating at scramble #                                                 # Ver 2 of script, this one will try to build the list of possible # two letter combinations that any word could start with, using an array !                                                                     #                                                                      # Usage: scramble.sh -l "letters"                                      #                                                                      # Created P Hurley  15 July 2008                                      #                                                                      # # usage="\nBatch script to cheat at scramble\n" usage+="Basically, this script will extract all the 8,7,6,5,4 and 3 letter words from\n"                                                       usage+="\t /usr/share/dict/words based on the letters provided and print them\n"                                                               usage+="\tscramble.sh -l letters > device\n"                           today=$(date +%Y%m%d) current_path=`pwd`  while getopts "l:" opt do                   case $opt in l ) letters=$OPTARG ;; \? ) echo -e $usage   exit 1           esac                          done                                  sleep 3                               #echo $letters                        #Output lists of words                #########################################################################                                                                      #setup com port                                                        stty -F /dev/ttyS0 speed 2400                                          stty -F /dev/ttyS0 speed 2400                                          #########################################################################                                                                      #Declare Arrays, variables and Constants                               maxcols=5                                                              maxrows=5                                                              #########################################################################                                                                      #Begin Loop                                                            declare -a Arletters                                                   declare -a Arpossibles                                                 pipey="\|"                                                             row=4                                                                  # Read in letters into ArLetters                                       lenlet=${#letters}     # number of letters submitted                  for ((pos=0;pos arletters[pos]=${letters:pos:1}      #read the letters into the arletters array                                                             if [ ${arletters[pos]} = "q" ]; then                                 arletters[pos]="qu"                                                fi                                                                   done                                                                   row=$(echo -e "sqrt($lenlet)\nquit\n"|bc -q -i)        #find row length by sqruare root of num letters                                        #echo "${arletters[@]}"                                                #echo $lenlet                                                          #echo $row                                                             #######  Start main loop                                              n=0    # count number of possible combinations                        for ((y=1; y for ((x=1; x for ((dx=-1; dx<2; dx++)); do            #change in columns     for ((dy=-1; dy<2; dy++)); do #change in rows                tempcol=$[ $x + $dx ]                                      temprow=$[ $y + $dy ]                                      arrayindex1=$[ $x + ( $row * ( $y - 1 ) ) - 1 ]            arrayindex2=$[ $tempcol + ( $row * ( $temprow - 1 ) ) - 1 ] #          echo "Column "$x", Row "$y" arraynum "$arrayindex1" "$arrayindex2".Letter "${arletters[$arrayindex1]}". Square "$tempcol" by "$temprow" letter "${arletters[arrayindex2]}                                  if [ $tempcol -gt 0 ]; then                              if [ $temprow -gt 0 ]; then                            if [ $tempcol -ne $x -o $temprow -ne $y ]; then      if [ $temprow -lt $row ];then                    if [ $tempcol -lt $row ];then                  #                        echo "Hit: arpossibles["$n"] will be "${arletters[arrayindex1]}${arletters[arrayindex2]}                             arpossibles[n]="${arletters[arrayindex1]}${arletters[arrayindex2]}"                                                  n=$[ $n + 1 ]                                fi                                                 fi                                                   fi                                                     fi                                                       fi                                                         done                                                         done                                                           done                                                             done                                                               #echo $n                                                               #echo "${arpossibles[@]}"                                              ############ build searchstring                                       searchstring="${arpossibles[0]}"                                       for ((l=1; l<$n; l++)); do                                             # echo $l" is "${arpossibles[l]}                                      searchstring="$searchstring$pipey${arpossibles[l]}"                  done                                                                   #debug echo $searchstring                                             ################ do the searches                                       #This reads out the standard dictionary, pipes it to grep to do the search                                                                     #and then pipes that through sed to replace the newlines with several new                                                                      #lines and a '1' ona line of it's own. The barcode wedge will turn the 1                                                                     #into a hard newline to try to stop it getting confused                cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g'      # 10 letter words                              cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g' # 9 letter words                                               cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g'  # 8 letter words                                                        cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g'     # 7 letter words                                                               cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g'       # 6 letter words cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g' # 5 letter words               cat /usr/share/dict/words | grep "^\($searchstring\)[$letters][$letters]$" | sed 's/.$/&\n\n\n1\n/g'   # 4 letter words                       cat /usr/share/dict/words | grep "^\($searchstring\)[$letters]$" | sed 's/.$/&\n\n\n1\n/g'     # 3 letter words                               #Do word counts ten=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"`# 10 letter words                                                       nine=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"` # 9 letter words                                                               eight=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters][$letters]$"`  # 8 letter words seven=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters][$letters][$letters]$"`    # 7 letter words       six=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters][$letters]$"` # 6 letter words                       five=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters][$letters]$"` # 5 letter words                               four=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters][$letters]$"`   # 4 letter words                                       three=`cat /usr/share/dict/words | grep -c "^\($searchstring\)[$letters]$"`    # 3 letter words                                               echo "scramble2.sh,"$letters","$ten","$nine","$eight","$seven","$six","$five","$four","$three echo "scramble2.sh,"$letters","$ten","$nine","$eight","$seven","$six","$five","$four","$three >> scramble.txt #debug echo "^$searchstring[$letters][$letters][$letters][$letters][$letters][$letters]$" # comparison for older script ten=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"`     # 10 letter words nine=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"`     # 9 letter words eight=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"`       # 8 letter words seven=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters][$letters][$letters]$"` # 7 letter words six=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters][$letters]$"`     # 6 letter words five=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters][$letters]$"`      # 5 letter words four=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters][$letters]$"` # 4 letter words three=`cat /usr/share/dict/words | grep -c "^[$letters][$letters][$letters]$"` # #3 letter words echo "scramble.sh,"$letters","$ten","$nine","$eight","$seven","$six","$five","$four","$three echo "scramble.sh,"$letters","$ten","$nine","$eight","$seven","$six","$five","$four","$three >> scramble.txt #echo "^[$letters][$letters][$letters][$letters][$letters][$letters][$letters][$letters]$" echo $letters >> letters.txt |






