# # Python program to solve target word puzzle. # detail comments are in accompanying blog post. # import sys # calculate the 'signature' of a string # signature is a 26 long integer array counting the number of each letter def sig(w): l = list(w) lettercount = range(26) for i in range(26): lettercount[i]=l.count(alpha[i]) return lettercount # get a subset of the system dictionary, lower case, no newlines, # no words to short or too long, and must have the target letter def get_wordlist(letter): wl = open('/usr/share/dict/web2','r').readlines() return [w.strip('\n') for w in wl if (len(w)>4) and (len(w)<11) and 0<w.count(letter) and w.lower()==w] # core of the program - get list of candidate words from dictionary. # compare signatures of candidate words with signature of target string # and format result def check_target(letters): if len(letters)<>9: return 'Argument should be exactly nine letters' wordlist = get_wordlist(letters) tarsig = sig(letters) result = [w for w in wordlist if sigin(sig(w),tarsig)] result = [(len(w)==9) and w.upper() or w for w in result] return reduce(lambda x,y:x+" "+y,result) # compare signatures of words to see if one could be made from the other def sigin(small,large): return min(map(lambda x,y:x<=y,small,large)) # Main part of program - everything above is functions. # Call "check_target" on the argument if there is one otherwise ask user alpha='abcdefghijklmnopqrstuvwxyz' if len(sys.argv)>1: print check_target(sys.argv) else: print check_target(raw_input())
Sunday, October 26, 2008
Sorry, the comment form is closed at this time.