[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.
يبدو ان المشكلة فى المبتدأ و الفكرة, هل من بدائل ؟
[COLOR="RoyalBlue"]
1- استخدمت "Check list" حتي اتاكد ان الكلمة التي تم توليدها موجودة في القاموس .
2- كتب "Check list" داخل While حتي يبدأ من جديد فى حالة عدم وجود الكلمة في القاموس .
3-
مثال: لديك كلمة "pnehoix", يقوم البرنامج يبديل اماكن الحروف (من خلال Repeat Loop) حتي تصل الي كلمة موجودة في القاموس (التي هي "phoenix").
وعليكم السلام ورحمة الله وبركاته
مرحبا بالـ Goblin أين كنت ؟
- عطل عرض المكونات ثم فعّله عند النهاية (BeginUpdate/EndUpdate)
- إذا كنت تستخدم نسخة دلفي 2006 فما فوق، إجعل الدوال التي تناديها باستمرار (Check list) بتوجيه inline
- ربما يمكن بطريقة ما تحميل قائمة الكلمات إلى الذاكرة (TStringList كبديل) لأجل زيادة سرعة الفحص
بالتوفيق.
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
TF6M كتب :لكن :
طريقتك بها بعض الأخطاء مثل أنه يبحث عن التعديل حتى و إن كانت صحيحة ؟؟
و لا يعدل بطريقة مدروسة بل عشوائية ؟ لهذا النتيجة تأتي بعد طول إنتظار !!! .
بالتوفيق ,,
احسنت اخي tf6m هذا ما اعنيه, اذا ماذا افعل لمعالجة هذا ؟
أنا فقط قمت بوضع إقتراح (توجيه) ...
1- حللنا مشكل التوقف (البرنامج يتجمد) بإستخدام THread يعالج تعليمات البرنامج .
2- الأن يجب عليك وضع خوارزمية بحث & مقارنة سريعة و مختصرة .
TF6M كتب :2- الأن يجب عليك وضع خوارزمية بحث & مقارنة سريعة و مختصرة .
:rtfm3:
[COLOR="RoyalBlue"]حسنا, لدي بعض الافكار اود تطبيقها:-
1- ان يتم تحميل القاموس فى البرنامج "دفعة واحدة" حتي اتجنب تكرار فتح القاموس لاجراء المقارنة.
2- ان ابتعد عن منهجية ال"Random" و ابدأ فى منهجية اخري تبتعد عن تكرار الناتج.
3- ؟؟؟؟؟؟