The puzzle was a nine letter target, common in Australian newspapers. The aim is to find all possible words in a 3 by 3 grid of letters with between 4 and 9 letters, and the word must also contain the central letter. A puzzle generator is available online.

I managed it, just ;-), with a bit of haggling over whether some of the words were acceptable.
import sys
import collections
def freq(letters):
'''
Construct a mapping of letter to frequency in a particular word
{ char -> int }
'''
d = collections.defaultdict(int)
for c in letters:
d[c] += 1
return d
def validWord(word, special, targetFreq):
'''
Check if a word matches the nine letter word rules
'''
# must satisfy length criteria
if len(word) < 4:
return False
# must contain central letter
if special not in word:
return False
# must satisfy letter frequencys
f = freq(word)
for c in word:
if c not in targetFreq:
return False
if f[c] > targetFreq[c]:
return False
return True
def nineLetterTarget( letters, dictionaryFile ):
matches = []
letters = letters.lower()
special = letters[4]
targetFreq = freq(letters)
with open( dictionaryFile, 'r' ) as dictfh:
for line in dictfh:
# remove end of line marker
line = line[:-1]
# lower case the word
line = line.lower()
# only keep the word if it matches
if validWord(line, special, targetFreq):
matches.append(line)
matches.sort( key = lambda word : len(word) )
return matches
if __name__ == "__main__":
dictFile = '/usr/share/dict/british-english'
letters = 'vnogdreec'
words = nineLetterTarget( letters, dictFile )
for word in words:
print word
No comments:
Post a Comment