Early in the summer of 2019, I attended the Wolfram High School Summer Camp. I worked on a project for two weeks which generates a crossword with random words that the user can solve and check. In this post, I will give a general outline of my project, then go into detail about my though process, and finally show the finished product.
How it Works
My project is basically a grid of variables, with the variables containing strings. This may seem simple, but it isn't as easy at it looks. The tricky part is having the strings change to very specific things based on random data each time the user evaluates. This makes the words in the crossword random each time in order to truly generate new crosswords each time.
Initial Start
I started by simply trying to overlay two words, but that didn't work out well...
After that attempt, I tried a completely different approach by using grid, variables, and then associations to make a primitive crossword with a few words in it.
Grid[Join[{{Black, Black, AsNwWord[1], Black, Black,
Black}}, {SmpWord},
Table[{Black, Black, AsNwWord[n], Black, Black, Black}, {n,
RevAsNwWord[AsSmpWord[3]] + 1, Length[NwWord], 1}]], Frame -> All]
This made the nice output of the following:
Preparation
Firstly, I filtered out all profane words, just to be safe...
lotswords = Pick[WordData[], First /@ Values[
KeyTake[Classify["Profanity", WordData[], "Probabilities"],
True]], p_ /; p < 0.5]
Then I defined functions to make associations and character lists for all of the words in the crossword.
charwordprep[Word_] := Flatten[Characters[Word]]
aswordprep[Word_] :=
With[{wWord = Flatten[Characters[Word]]},
AssociationThread[Range[Length[wWord]], wWord]]
hintwordprep[Word_] :=
Part[Flatten[
Part[WordData[StringDrop[StringDrop[ToString[Word], 1], -1],
"Definitions"], 1]], 2]
lengthwordprep[Word_] := ToString@Length[charwordprep[Word]]
After that, I made variables for hints, hint helpers, and the correct solution. Then came the really fun part: I made the actual crossword. This could be done with such little code; I was amazed beyond belief!
fillercross = Framed[Grid[Partition[
MapIndexed[If[#1 == 1, BlackSquare, WhiteSquares[#2[[1]]]] &,
Flatten[pattern]], 10], Background -> Black],
Background -> Black];
This had an output that looked like a crossword and that the user could type into which stored the data: I then created a variable that checked the solution that the user typed in by using a simple if statement.
solvecheck = Dynamic[If[
StringReplace[ToString[input], "Null" -> " "] ==
StringDrop[StringDrop[ToLowerCase[ToString[correctlist]], 1], -1],
Style[colorize2["This is correct!", ColorData["Rainbow"]], Bold,
140], Style["Sorry... try again...", Bold, 40]]]
Final Input
After making all the variables and functions in preparation for this, I finally made the manipulate! The code follows:
Framed[Manipulate[
Column[{
Style["Crossword Creator!", Bold, 50],
"",
"",
"Please fill the generated crossword.",
"You can type in the words, but make sure to click on each box and
insert only one letter per box.",
"Fill the crossword with words which have the following HINTS: ",
"",
horizhintz,
"",
verthintz,
"",
HintFirstLetters,
"",
HintLength,
"",
Wordbank,
"",
minicross,
"",
fillercross,
"",
SolutionChecker,
"",
Answers ,
"",
Style["Thank you for playing and have a great day!" , 50,
Italic]}],
{HintFirstLetters, {"" -> "Hide",
firstletters -> "Show"}}, {HintLength, {"" -> "Hide",
hintlength -> "Show"}}, {Wordbank, {"" -> "Hide",
wordbank -> "Show"}}, {Answers, {"" -> "Hide",
showanswers -> "Show"}}, {SolutionChecker, {"" -> "Not Yet",
solvecheck -> "Check!"}}, ImageMargins -> Large],
FrameMargins -> 0]
The Final Output
Here is the project's summative output:
Reflection
Throughout the process of the development of my project, I learned a few very valuable things. I learnt that even if one sets impossible goals, with time, one will accomplish said goals. Also, I realized that hard problems can be overcome with relatively simple solutions, it's just a matter of choosing the correct approach.
I would like to thank my mentor Sylvia Haas for helping me in so many ways throughout the stressful and difficult process of making this project.
https://github.com/SimeonButtery/WSS-Template