Welcome to HBH! If you have tried to register and didn't get a verification email, please using the following link to resend the verification email.

Unscramble.py - Python Code Bank


Unscramble.py
Unscrambles jumbled up words. Code has been updated and now uses OOP.
                #!/usr/bin/python
# Filename: unscramble.py

####################################################################################################
# Python version: 2.6.6
# Date: 1/22/2011
# Author: The Ripper
# Original Author: southafrica1
# email: theriipper@gmail.com
#        scottkriel@yahoo.com
# Published to: www.hellboundhackers.org
####################################################################################################

class UnScramble:
    '''unscramble words which have had their letters swopped around'''
    def __init__(self):
        '''Setup lists for storing matching words and letters'''
        self.string = ""
        self.has_same_letters = []
        self.checked_double_letters = []
        self.letter_a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        self.letter_b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        self.a_whole = 0
        self.b_whole = 0
        self.possable_solutions = []
    
    def RunUnScramble(self, string='abase', wordlist_path='dictionary.txt'):
        '''Convenience method for running application'''
        self.SetString(string)
        self.OpenWordlist(wordlist_path)
        self.RunSameLettersCheck()
        self.RunDoubleLettersCheck()
        self.SetPossableSolutions()
    
    def SetString(self, string):
        '''Set the string to be UnScrambled'''
        self.string = string
        
    def SetPossableSolutions(self):
        '''
        set possable_solutions to equal checked double letters.
        This is a convenience for getting the values from the application while leaving room for
        other check methods to be implemented.
        '''
        self.possable_solutions = self.checked_double_letters[:]
    
    def OpenWordlist(self, path_to_wordlist='dictionary.txt'):
        '''Create wordlist file object for iteration'''
        self.wordlist = open(path_to_wordlist, 'r')
        
    def RunSameLettersCheck(self):
        '''
        Checks each character in the scrambled word seperately against each word in the wordlist and
        gives it the value of 0 if it appears in that word
        '''    
        for line in self.wordlist:
            if (self.string[:1]) in (line):     
                self.letter_a[0] = 0               
            else:                          
                self.letter_a[0] = 1                      
       
            if (self.string[1:2]) in (line):
                self.letter_a[1] = 0 
            else:
                self.letter_a[1] = 1 
     
            if (self.string[2:3]) in (line):
                self.letter_a[2] = 0 
            else:
                self.letter_a[2] = 1 
     
            if (self.string[3:4]) in (line):
                self.letter_a[3] = 0 
            else:
                self.letter_a[3] = 1 
     
            if (self.string[4:5]) in (line):
                self.letter_a[4] = 0 
            else:
                self.letter_a[4] = 1 
     
            if (self.string[5:6]) in (line):
                self.letter_a[5] = 0 
            else:
                self.letter_a[5] = 1 
     
            if (self.string[6:7]) in (line):
                self.letter_a[6] = 0 
            else:
                self.letter_a[6] = 1 
     
            if (self.string[7:8]) in (line):
                self.letter_a[7] = 0 
            else:
                self.letter_a[7] = 1 
     
            if (self.string[8:9]) in (line):
                self.letter_a[8] = 0 
            else:
                self.letter_a[8] = 1 
     
            if (self.string[9:10]) in (line):
                self.letter_a[9] = 0 
            else:
                self.letter_a[9] = 1 
            
            # This adds the values of all the characters together
            self.a_whole = (self.letter_a[0] + self.letter_a[1] + self.letter_a[2] + self.letter_a[3] + self.letter_a[4] + self.letter_a[5] + 
                            self.letter_a[6] + self.letter_a[7] + self.letter_a[8] + self.letter_a[9])
            # BRAKES CODE!!!
            # for i in self.letter_b[:]:
            #     self.b_whole += i
            
            if len(line) == len(self.string) + 1:
                # If a_whole == 0 then all the char in the string appear in the word of the list
                if (self.a_whole) == 0:            
                    # Appends the word to the list we setup in __init__
                    self.has_same_letters.append(line)    
                    
    def RunDoubleLettersCheck(self):
        '''
        Checks the characters in the list of words against the string.
        By doing this we check that all the characters in the list appear in the string.
        If we didnt do this the program would say that school = slouch because all the characters 
        in school appear in slouch, but not all the characters in slouch appear in school.
        '''
        for i in range(0, len(self.has_same_letters)): 
            if (self.has_same_letters[i][:1]) in (self.string):
                self.letter_b[0] = 0
            else:
                self.letter_b[0] = 1

            if (self.has_same_letters[i][1:2]) in (self.string):
                self.letter_b[1] = 0
            else:
                self.letter_b[1] = 1

            if (self.has_same_letters[i][2:3]) in (self.string):
                self.letter_b[2] = 0
            else:
                self.letter_b[2] = 1

            if (self.has_same_letters[i][3:4]) in (self.string):
                self.letter_b[3] = 0
            else:
                self.letter_b[3] = 1

            if (self.has_same_letters[i][4:5]) in (self.string):
                self.letter_b[4] = 0
            else:
                self.letter_b[4] = 1

            if (self.has_same_letters[i][5:6]) in (self.string):
                self.letter_b[5] = 0
            else:
                self.letter_b[5] = 1

            if (self.has_same_letters[i][6:7]) in (self.string):
                self.letter_b[6] = 0
            else:
                self.letter_b[6] = 1

            if (self.has_same_letters[i][7:8]) in (self.string):
                self.letter_b[7] = 0
            else:
                self.letter_b[7] = 1

            if (self.has_same_letters[i][8:9]) in (self.string):
                self.letter_b[8] = 0
            else:
                self.letter_b[8] = 1

            if (self.has_same_letters[i][9:10]) in (self.string):
                self.letter_b[9] = 0
            else:
                self.letter_b[9] = 1

            if (self.has_same_letters[i][10:11]) in (self.string):
                self.letter_b[10] = 0
            else:
                self.letter_b[10] = 1

            if (self.has_same_letters[i][11:12]) in (self.string):
                self.letter_b[11] = 0
            else:
                self.letter_b[11] = 1

            if (self.has_same_letters[i][12:13]) in (self.string):
                self.letter_b[12] = 0
            else:
                self.letter_b[12] = 1

            if (self.has_same_letters[i][13:14]) in (self.string):
                self.letter_b[13] = 0
            else:
                self.letter_b[13] = 1
                
            if (self.has_same_letters[i][14:15]) in (self.string):
                self.letter_b[14] = 0
            else:
                self.letter_b[14] = 1
                
            # This adds the values of all the characters together
            for i in self.letter_b[:]:
                self.b_whole += i
                if (self.b_whole) == 0:
                    self.checked_double_letters.append(self.has_same_letters[i])
       
if __name__ == '__main__':
    while True:
        us = UnScramble()
        scrambled_word = raw_input("\nEnter word you would like unscrambled. Type '/end/' to quit: ")
        if scrambled_word == '/end/':         # Allows user to   exit loop       
            break
        us.RunUnScramble(string=scrambled_word)
        print(us.possable_solutions[0])
        us = None
            
Comments
southafrica1's avatar
southafrica1 13 years ago

Nice work! drastic improvement on my code:D