| 
 
		
			| 
				
Search
 As of October, 2016, Embarcadero is offering a free release 
				of Delphi (Delphi 
				10.1 Berlin Starter Edition ).     There 
				are a few restrictions, but it is a welcome step toward making 
				more programmers aware of the joys of Delphi.  They do say 
				"Offer may be withdrawn at any time", so don't delay if you want 
				to check it out.  Please use the
				feedback link to let 
				me know if the link stops working.  
   Support DFF - Shop  If you shop at Amazon anyway,  consider 
				using this link.        
				 We receive a few cents from each 
				purchase.  Thanks  
 
Support DFF - Donate If you benefit from the website,  in terms of 
				knowledge, entertainment value, or something otherwise useful, 
				consider making a donation via PayPal  to help defray the 
				costs.  (No PayPal account necessary to donate via credit 
				card.)  Transaction is secure. 
				 
				Mensa® 
				Daily Puzzlers For over 15 years 
				Mensa Page-A-Day calendars have provided several puzzles a year 
				for my programming pleasure.  Coding "solvers" is most fun, 
				but many programs also allow user solving, convenient for "fill 
				in the blanks" type.  Below are Amazon  links to the 
				two most recent years. 
				
				Mensa® 
				365 Puzzlers  Calendar 2017 
				
				Mensa® 
				365 Puzzlers Calendar 2018 
				 (Hint: If you can 
				wait, current year calendars are usually on sale in January.) 
				Contact
				Feedback: 
				Send an 
				e-mail with your comments about this program (or anything else). 
				 
   |      |  | Problem Description
 Find the word in this partially filled grid which starts in one corner and 
circles the board to end in the center square.  Background & TechniquesHere's the puzzle from the January 3 puzzle in "The Brain Game", our daily 
puzzle calendar for 2013.  (My rule is that I can use any program I have 
written as a brain extender J!) "A nine letter word is starts at a corner and 
spirals into the center. Fill in the missing letters to find out what it is."
 For different puzzles, click on the grid to enter edit mode, key in the new 
changes, 
then press the "Make templates"  button to exit edit
mode and start solving. Click the "Search templates " button to search 
the dictionary for the matching word.
 
 Non-programmers are welcome to read on, but may want to jump to bottom of
this page to download the executable program now. Programmer's Notes:For future reference, here are few tips and techniques used in this program . 
|  | The strategy for solving the problem is to generate the 8 possible word 
templates for words starting each of the 4 corners proceeding clockwise or 
counterclockwise around the grid before ending with the letter in the 
center.  Then we'll use our UDict unit to retrieve all 9 letter 
words in the largest dictionary ( "Full.dic") and check each word 
against each template looking for those that have matching letters in 
positions where the letters in the template are known. |  |  | If we make a string of letters and ? characters starting in the 
top left corner and concatenate (join together) the top row, the last 
column, the bottom row from right to left and the first column from bottom 
to top we have the first 8 letter template. 
|  | {make a clockwise string around the border 
from top left corner} scw:=cells[0,0]+cells[1,0]+cells[2,0]+cells[2,1]+cells[2,2]
 +cells[1,2]+cells[0,2]+cells[0,1];
 |  |  | The corresponding template in the other direction is simply the 
first template reversed.  Function "ReverseString" in 
Delphi's StrUtils unit does exactly what we need. 
sccw:= reverseString(scw); |  |  |  | To get the template starting form the next corner, all we must do is 
move the first two characters to the end of the string. (e.g.
s:=copy(s,3,6)+copy(s,1,2);)  Repeat that 
3 times, add that center character,   and we have all 4 templates for one direction.  Do the same 
thing on the reversed string and we'll have the 4 counterclockwise templates. |  |  | A dictionary named PubDic is automatically created by the UDict 
unit.  Function LoadLargeDic is called to load the large 
dictionary, prompting you for the location if it is not in the same folder 
as the program.    The dictionary is remembered from run to 
run in file Dic.ini.  Delete this file to specify a  
dictionary from a different location. |  |  | A call to Pubdic.Setrange procedure will tell the dictionary that 
you want to sequentially retrieve all 9 letter words starting with letters 
"A" though "Z".  Then a "While GetNextWord" loop will retrieve 
each 
word and return True until all have been  processed. |  |  | We pass each word retrieved against all 8 templates, discarding any word 
with a character which does not have the same letter or a ? in the template.  
A solution is any word which pass the matching test for all 9 letters. |  |  | An OnDrawCell event exit is used to center the character in the center 
of each grid cell by placing the top left corner at the center of the cell 
minus half of the character's width and half the character's height like 
this:  with rect do textout((left + right - 
textwidth(s)) div 2, (top + bottom -textheight(s)) div 2, s); |  |  | To allow changes to the grid, the editor features must be enabled but in 
edit mode the currently selected cell is highlighted and displayed in the 
default location, distracting for normal usage.  To avoid the 
distraction when not editing, I added an OnClick event exit with this 
statement to add the GoAlwaysShowEditor option to the set of grid 
options when the user clicks on the grid: with 
stringgrid1 do options:=options + [goAlwaysShowEditor];   
The "Make templates" button turns the option off again to restore the 
normal display by subtracting the option from the set. |  Running/Exploring the Program Suggestions for Further Explorations
|  | ??? |  
|  |  |    
| Original:  January 4, 2013 | Modified:  
May 15, 2018  |  |