Anagram
#1
[COLOR="RoyalBlue"]السلام عليكم و رحمة الله و بركاته

كنت اعمل علي برنامج "لاعادة ترتيب الحروف الغير مرتبة" من خلال قائمة "Wordlist".

مثال:

- لدي هذه الحروف "4ibADealprh", ما حاول عمله هو اعادة ترتيبها لتصبح "Delphi4Arab".

- المشكلة هي بطء البرنامج لتنفيذ هذه العملية.

هذا هو ال Source:[/COLOR]

كود :
Function CheckList(CheckWord : String):Boolean; var F : TextFile; Temp : String; begin Result := False; AssignFile(F,'wordlist.txt'); Reset(F); While Not Eof(F) do begin Readln(F,Temp); If Temp = CheckWord then begin Result := True; Break; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var FRand, MRand, RandedWord : String; RandIndex : Integer; begin FRand := Edit1.Text; While CheckList(RandedWord) = False do begin MRand := FRand; RandedWord := ''; Repeat Application.ProcessMessages; [COLOR="Red"]Randomize; RandIndex := RandomRange(1,Length(MRand)); RandedWord := RandedWord + MRand[RandIndex]; Delete(MRand,RandIndex,1);[/COLOR] Until MRand = ''; end; Edit2.Text := RandedWord; end; end.

يبدو ان المشكلة فى المبتدأ و الفكرة, هل من بدائل ؟
الرد
#2
و عليكم السلام و رحمة الله و بركاته

1- لمذا إستعملت أصلا CheckList ؟؟ ماذا لو كان الملف يحتوي على أكثر من سطر
أو حروف متباعدة أو غير نصي .

2- كتبت CheckList داخل While إظافة إلى Repeat و هي بدورها Loop ؟؟
سيتجمد التنفيذ حتى لو إستدعينا ProcessMessages .

3- فكرة البرنامج "إعادة ترتيب الحروف" .... بالنسبة لأي مرجع ؟ .
I'M Fly Like A G6

الرد
#3
[COLOR="RoyalBlue"]
1- استخدمت "Check list" حتي اتاكد ان الكلمة التي تم توليدها موجودة في القاموس .
2- كتب "Check list" داخل While حتي يبدأ من جديد فى حالة عدم وجود الكلمة في القاموس .
3-
مثال: لديك كلمة "pnehoix", يقوم البرنامج يبديل اماكن الحروف (من خلال Repeat Loop) حتي تصل الي كلمة موجودة في القاموس (التي هي "phoenix").

القاموس فى المرفقات.[/COLOR]


الملفات المرفقة
.rar   wordlist.rar (الحجم : 5.02 ك ب / التحميلات : 24)
الرد
#4
إستخدم الـ [COLOR="Red"]THreads بديل قوي و فعال ![/COLOR]
I'M Fly Like A G6

الرد
#5
وعليكم السلام ورحمة الله وبركاته
مرحبا بالـ Goblin أين كنت Big Grin؟
- عطل عرض المكونات ثم فعّله عند النهاية (BeginUpdate/EndUpdate)
- إذا كنت تستخدم نسخة دلفي 2006 فما فوق، إجعل الدوال التي تناديها باستمرار (Check list) بتوجيه inline
- ربما يمكن بطريقة ما تحميل قائمة الكلمات إلى الذاكرة (TStringList كبديل) لأجل زيادة سرعة الفحص
بالتوفيق.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#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() 
الرد
#7
يعني و كأنك تجاوزت الحل المقترح (THread) و ذهبت بعيدا ؟؟ (بحث غوغل)
شوف لما نستعمل Thread بسيط .. حلت المشكلة تماما .


[صورة: gfhgfp.jpg]

لكن :

طريقتك بها بعض الأخطاء مثل أنه يبحث عن التعديل حتى و إن كانت صحيحة ؟؟
و لا يعدل بطريقة مدروسة بل عشوائية ؟ لهذا النتيجة تأتي بعد طول إنتظار !!! .

بالتوفيق ,,


الملفات المرفقة
.rar   UseThread.rar (الحجم : 6.63 ك ب / التحميلات : 24)
I'M Fly Like A G6

الرد
#8
TF6M كتب :لكن :
طريقتك بها بعض الأخطاء مثل أنه يبحث عن التعديل حتى و إن كانت صحيحة ؟؟
و لا يعدل بطريقة مدروسة بل عشوائية ؟ لهذا النتيجة تأتي بعد طول إنتظار !!! .

بالتوفيق ,,

احسنت اخي tf6m هذا ما اعنيه, اذا ماذا افعل لمعالجة هذا ؟
الرد
#9
أنا فقط قمت بوضع إقتراح (توجيه) ...
1- حللنا مشكل التوقف (البرنامج يتجمد) بإستخدام THread يعالج تعليمات البرنامج .
2- الأن يجب عليك وضع خوارزمية بحث & مقارنة سريعة و مختصرة .

بالتوفيق ,,
I'M Fly Like A G6

الرد
#10
TF6M كتب :2- الأن يجب عليك وضع خوارزمية بحث & مقارنة سريعة و مختصرة .

:rtfm3:

[COLOR="RoyalBlue"]حسنا, لدي بعض الافكار اود تطبيقها:-

1- ان يتم تحميل القاموس فى البرنامج "دفعة واحدة" حتي اتجنب تكرار فتح القاموس لاجراء المقارنة.
2- ان ابتعد عن منهجية ال"Random" و ابدأ فى منهجية اخري تبتعد عن تكرار الناتج.
3- ؟؟؟؟؟؟

ستسعدي اقتراحتكم.[/COLOR]
الرد


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


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