| | |
word unscrambler
Please support our Python advertiser: Programming Forums - DaniWeb Sister Site
Thread Solved |
•
•
Join Date: Jun 2006
Posts: 1
Reputation:
Solved Threads: 0
hi,
This is my problem i have programmed a little word unscrambler i have a file wordlist.txt in my python folder and this program works just fine and unscrambles one word at a time but i dont how how to edit it to make it unscramble 10 words at a time can someone please help??
thanks
ps i want it to print the solution in this format:
word1, word2, word3,.......all the way to word10
here is my code
ps it prints the same solution multiple times
This is my problem i have programmed a little word unscrambler i have a file wordlist.txt in my python folder and this program works just fine and unscrambles one word at a time but i dont how how to edit it to make it unscramble 10 words at a time can someone please help??
thanks
ps i want it to print the solution in this format:
word1, word2, word3,.......all the way to word10
here is my code
ps it prints the same solution multiple times
Python Syntax (Toggle Plain Text)
import string def anagrams(s): if s == "": return [s] else: ans = [] for an in anagrams(s[1:]): for pos in range(len(an)+1): ans.append(an[:pos]+s[0]+an[pos:]) return ans def dictionary(wordlist): dict = {} infile = open(wordlist, "r") for line in infile: word = line.split("\n")[0] dict[word] = 1 infile.close() return dict def main(): diction = dictionary("wordlist.txt") for i in range(10): anagram = raw_input("Please enter a words you need to unscramble: ") anaLst = anagrams(anagram) for ana in anaLst: if diction.has_key(ana): print "The solution to the jumble is", ana main()
I took your code and changed it mildly to give you an idea how to proceed ...
You could limit the scrambled words entered with a loop.
Python Syntax (Toggle Plain Text)
# unscramble a line of words def permutation(s): if s == "": return [s] else: ans = [] for an in permutation(s[1:]): for pos in range(len(an)+1): ans.append(an[:pos]+s[0]+an[pos:]) return ans def dictionary(wordlist): dict = {} infile = open(wordlist, "r") for line in infile: word = line.split("\n")[0] # all words in lower case!!! word = word.lower() dict[word] = 1 infile.close() return dict def main(): diction = dictionary("wordlist.txt") # enter all the words that fit on a line or limit the number anagram = raw_input("Please enter space separated words you need to unscramble: ") wordLst = anagram.split(None) for word in wordLst: anaLst = permutation(word) for ana in anaLst: if diction.has_key(ana): diction[ana] = word #print "The solution to the jumble is" , ana solutionLst = [] for k, v in diction.iteritems(): if v != 1: solutionLst.append(k) print "%s unscrambled = %s" % (v, k) print solutionLst main()
May 'the Google' be with you!
•
•
Join Date: Jul 2006
Posts: 608
Reputation:
Solved Threads: 150
I liked your recursive anagram creator, but it is expensive because it generates n! strings for a size n scramble. I tested it with
and my reasonably fast machine cried and locked up. :lol:
Another possibility would be to test whether your scramble is an anagram for each word in the list. You could do this by seeing whether each letter in the scramble is somewhere in the word, removing that letter from the word if found. Here's the idea:
In the worst case, this runs O(n^2 * length of dictionary), but with much better performance on average. I found a noticeable speed-up just on this: print isanagram("Hi There", "There Hi")
hope it helps,
Jeff Cagle
Python Syntax (Toggle Plain Text)
print anagrams("Hi There")
Another possibility would be to test whether your scramble is an anagram for each word in the list. You could do this by seeing whether each letter in the scramble is somewhere in the word, removing that letter from the word if found. Here's the idea:
Python Syntax (Toggle Plain Text)
def isanagram(source, target): """returns True if source is an anagram of target, False otherwise.""" # speed-up if your dictionary is large: # if len(source) != len(target): return False for i in source: pos = target.find(i) if pos == -1: return False else: # remove found letter from the target (non-destructively) target = target[:pos]+target[pos+1:] return True
In the worst case, this runs O(n^2 * length of dictionary), but with much better performance on average. I found a noticeable speed-up just on this: print isanagram("Hi There", "There Hi")
hope it helps,
Jeff Cagle
![]() |
Similar Threads
- Word Association Game (Posting Games)
- Word Scramble Game (Posting Games)
- What's wrong with this code? (Python)
- Reading from a file question (Python)
- Word and/or Data Encryption (Visual Basic 4 / 5 / 6)
Other Threads in the Python Forum
- Previous Thread: Extract header info from image file
- Next Thread: Deleting directory structures
| Thread Tools | Search this Thread |
accessdenied advanced apache application argv beginner change command csv def dictionary dynamic edit enter event examples file float format function google gui homework import inches input jaunty java keyboard lapse library line lines linux list lists loop microphone mouse movingimageswithpygame mysql newb number numbers numeric obexftp output parameters parsing path phonebook port prime programming projects py2exe pygame pygtk pyopengl python random recursion redirect remote return reverse scrolledtext session simple skinning smtp software sprite statictext stderr string strings syntax table tennis terminal text thread threading time tkinter tlapse trick tuple tutorial ubuntu unicode unit urllib urllib2 variable voip windows wordgame wxpython






