It is trivial to write a program to generate word search puzzles, so I decided to make the problem more interesting by adding a difficulty parameter. I could generate puzzles with a range of difficulty by varying the following factors:
* direction -- more difficult puzzles have answers in diagonal and/or reverse directions
* density -- more difficult puzzles do not necessarily have the answers uniformly distributed in the grid but can have dense groupings
* dummy words -- since some students search for any words in the grid, you can fill it with words that are not actually target words to make the task more difficult
* decoys -- you can fill the grid with slight deviations of target words in order to make finding the actual target more difficult