Anagram
#6
kachwahed كتب :مرحبا بالـ Goblin أين كنت Big Grin؟
اعذرني اخي العزيز, منشغل بالدراسة.

kachwahed كتب :- عطل عرض المكونات ثم فعّله عند النهاية (BeginUpdate/EndUpdate)
- إذا كنت تستخدم نسخة دلفي 2006 فما فوق، إجعل الدوال التي تناديها باستمرار (Check list) بتوجيه inline
- ربما يمكن بطريقة ما تحميل قائمة الكلمات إلى الذاكرة (TStringList كبديل) لأجل زيادة سرعة الفحص
بالتوفيق.
[COLOR="RoyalBlue"]
- كلام جميل, لكن حتي بهذه التعديلات, لايزال البرنامج - فى اغلب الاحيان - غير فعال.
- بينما كنت ابحث فى "Google" وجد برنامج مكتوب بال"Python" يؤدي العلمية فى اقل من ثانية !
لذلك اعتقد ان هناك طريقة اخري لصياغة البرنامج, طريقة افضل و منهجية اسرع, بعيدة عن التكرار.

هذا هو ال"Source" الذي كنت اتكلم عنه:[/COLOR]

PHP كود :
MIN_WORD_SIZE = 4 # min size of a word in the output

class Node(object):
    
def __init__(self, letter='', final=False, depth=0):
        
self.letter = letter
        self
.final = final
        
self.depth = depth
        self
.children = {}
    
def add(self, letters):
        
node = self
        
for index, letter in enumerate(letters):
            if 
letter not in node.children:
                
node.children[letter] = Node(letter, index==len(letters)-1, index+1)
            
node = node.children[letter]
    
def anagram(self, letters):
        
tiles = {}
        for 
letter in letters:
            
tiles[letter] = tiles.get(letter, 0) + 1
        min_length 
= len(letters)
        return 
self._anagram(tiles, [], self, min_length)
    
def _anagram(self, tiles, path, root, min_length):
        if 
self.final and self.depth >= MIN_WORD_SIZE:
            
word = ''.join(path)
            
length = len(word.replace(' ', ''))
            if 
length >= min_length:
                yield 
word
            path
.append(' ')
            for 
word in root._anagram(tiles, path, root, min_length):
                yield 
word
            path
.pop()
        for 
letter, node in self.children.iteritems():
            
count = tiles.get(letter, 0)
            if 
count == 0:
                continue
            
tiles[letter] = count - 1
            path
.append(letter)
            for 
word in node._anagram(tiles, path, root, min_length):
                yield 
word
            path
.pop()
            
tiles[letter] = count

def load_dictionary
(path):
    
result = Node()
    for 
line in open(path, 'r'):
        
word = line.strip().lower()
        
result.add(word)
    return 
result

def main
():
    print 
'Loading word list.'
    
words = load_dictionary('words.txt')
    while 
True:
        
letters = raw_input('Enter letters: ')
        
letters = letters.lower()
        
letters = letters.replace(' ', '')
        if 
not letters:
            break
        
count = 0
        
for word in words.anagram(letters):
            print 
word
            count 
+= 1
        
print '%d results.' % count

if __name__ == '__main__':
    
main() 
الرد


الردود في هذا الموضوع
Anagram - بواسطة Goblin - 05-02-2010, 12:34 AM
Anagram - بواسطة TF6M - 05-02-2010, 01:06 AM
Anagram - بواسطة Goblin - 05-02-2010, 01:16 AM
Anagram - بواسطة TF6M - 05-02-2010, 01:34 AM
Anagram - بواسطة kachwahed - 05-02-2010, 09:58 AM
Anagram - بواسطة Goblin - 05-02-2010, 11:00 AM
Anagram - بواسطة TF6M - 05-02-2010, 11:36 AM
Anagram - بواسطة Goblin - 05-02-2010, 01:15 PM
Anagram - بواسطة TF6M - 05-02-2010, 01:46 PM
Anagram - بواسطة Goblin - 05-02-2010, 03:58 PM
Anagram - بواسطة TF6M - 05-02-2010, 04:19 PM
Anagram - بواسطة Goblin - 06-02-2010, 09:58 PM
Anagram - بواسطة TF6M - 06-02-2010, 10:21 PM
Anagram - بواسطة Goblin - 06-02-2010, 10:30 PM
Anagram - بواسطة Goblin - 15-02-2010, 07:23 PM
Anagram - بواسطة Goblin - 22-02-2010, 04:48 PM
Anagram - بواسطة AL-MOB4RM3G - 22-02-2010, 07:31 PM
Anagram - بواسطة mohfa - 22-02-2010, 08:25 PM
Anagram - بواسطة Goblin - 23-02-2010, 12:50 PM
Anagram - بواسطة mohfa - 23-02-2010, 07:28 PM
Anagram - بواسطة Goblin - 25-02-2010, 07:51 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم