![]() |
|
[مسابقة الخوارزمية 3] - الجولة الثالثة - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم الاعلانات العام (http://vb4arb.com/vb/forumdisplay.php?fid=1) +--- قسم : قسم مسابقات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=192) +---- قسم : ارشيف مسابقات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=193) +---- الموضوع : [مسابقة الخوارزمية 3] - الجولة الثالثة (/showthread.php?tid=18649) |
RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - الشاكي لله - 06-01-17 3?? : 98? Participant answer: 098 : 103 My answer: 098 : 093 Similarity Failed --- يرجى الانتباه انه الساعة 12 ليلا سيتم اغلاق الجولة. RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - اسلام الكبابى - 07-01-17 هذا هو الحل والحمد لله RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - الشاكي لله - 07-01-17 ?
RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - اسلام الكبابى - 07-01-17 عفوآ نسيت وضع ملفات التكست RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - الشاكي لله - 07-01-17 يبدو ان برنامجك لايعمل على جهازي بشكل جيد بسبب اختلاف الCulture ?! المهم اريد output هذين الملفين ، شغل البرنامج عندك وارفع لي الـ outputq1.txt + outputq2.txt RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - اسلام الكبابى - 07-01-17 والله العظيم ده آخر مرة جت جت مجتشى مجتش RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - الشاكي لله - 07-01-17 توليد الملف النصي خاطئ فعلا.. المهم سأحتسب النقطتين لان لو جمعنا الحل الاول والاخير الذي قمت به ، سيكون الحل صحيحا
RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - اسلام الكبابى - 07-01-17 شكرآ لك ألف شكر فموضوع التعامل مع ملفات النصوص موضوع جديد على لأن تخصصى فى برمجة الخوارزميات نفسها فقط RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - الشاكي لله - 07-01-17 انتهت الجولة الثالثة
وترتيب المتسابقين هو :
10 نقاط للأخ اسلام الكبابي 8 نقاط للإخ عبدالله الصافي 6 نقاط للاخ Fantastico جميع المشاركين حصلو على +2 بسبب تحقيقهم شرط (الاصغر الاقرب)
تنفيذ الخوارزمية
بما ان هذه الخوارزمية هي اكثر خوارزمية سببت الجدل في جميع مسابقات المنتدى ، فضلت ان اقوم بشرح كيفية تنفيذها بإسهاب كبير حتى تنتشر الفائدة بين الجميع .. علما بأن طريقة الحل المستخدمة في هذا الرد هي طريقة خاصة بالدوت نت ، وبالاخص (السي شارب) بسبب ان الاكواد المستخدمة في الحل نفسها تستخدم تقنيات لاتتوفر الا في الـ .Net Framework وكل هذا لكي يكون كود الخوارزمية نظيفا ورائعا وقابلا للفهم . ![]() ----------- 1- الدوال المُساعدة
في البداية ، قمنا بإنشاء Extension Methods (الدوال الممتدة) وهي دوال مُساعدة أنشأناها لتساعدنا في حل الخوارزمية ( مجرد دوال مساعدة لاشغل لها بالخوارزمية الفعلية) .. الدوال الممتدة هي احدى ميزات الدوت نت ولمن لايعرف اهميتها ، فهي باختصار.. مجرد دوال تستطيع الوصول اليها من المتغير مباشرة : PHP كود : public static class MyExtensionsوظائف الدوال موضحة بالتعليقات الخضراء ، وكما ترون .. هذه الدوال ممتدة هي مجرد دوال مساعدة سنستخدمها لاحقا .. الفائدة العظمى من الدوال الممتدة هي امكانية الوصول اليها من المتغير مباشرة ، فلاحظ الكود التالي :- PHP كود : string myStr = "?33:?4?";انا احب الدوال الممتدة اكثر من الدوال العادية في امور معالجة الـ Datatype وذلك بسبب انها تحقق احد مبادئ كتابة الكود high cohesion (عزل الاكواد) انتهينا من كتابة الدوال الممتدة المساعدة للخوارزمية ، ننتقل للكود الرئيسي :- 2- الكود الرئيسي
PHP كود : static string CloseMatch(string s1, string s2)الان نبدأ بشرح الاكواد جزء جزء :- 1 : PHP كود : //مخزنين لتخزين القيم المحتملة2 لست لتخزين القيم المحتملة ، كل لست يخزن القيم المحتملة لجزء من العينة values1 : values2 2: PHP كود : //جلب مواقع علامات الاستفهامالمتغير s1 يشير الى الجزء الايسر من العينة المتغير s2 يشير الى الجزء الايمن من العينة هنا نستعمل الدالة الممتدة ، لجلب مواقع علامات الاستفهام في العينة . 3: PHP كود : //اضافة القيم الاولية الى اللستة4: PHP كود : //دالة تكرارية لايجاد المجهولسنشرح ماذا تفعل هذه الدالة بالتفصيل لاحقا . ولكن هذه الدالة باختصار ـ تملأ الـ 2 لست بجميع القيم المحتملة للعينة. 5: PHP كود : //(حذف المكرر + الترتيب من الاصغر (لتحقيق شرط الاقرب الاصغرالشرط الذي جنن الجميع ، شرط جلب الاقرب الاصغر عند تساوي الفرق هنا استعملنا احدى تقنيات الدوت نت ، Linq ، واستخدمنا Distinct لحذف القيم المكررة واستخدمنا OrderBy للترتيب من الاصغر للاكبر . هذين الكودين مجرد تمهيد للكود القادم ... 6: PHP كود : //جلب الفرق الاقربهنا استعملنا Linq مجددا (كم اشفق على اللغات التي لايوجد لديها Linq ) >> والهدف من الكود واضحوهو الدوران على اللستة الاولى ، وعند كل دورة ، يتم الدوران على اللستة الثانية وحساب الفرق في القيم. 7: PHP كود : //اضافة اصفار اذا كان الناتج اقل من طول المدخلالنهاية الدراماتكية عند هذه الاكود ، فبعد جلب قيم s1 وs2 الاصغر والاقرب ، هنا اول سطرين يقومان بمعادلة طول الoutput مع طول الInput من خلال اضافة الاصفار.. مثلا : 3??:?2? يجب ان يظهر: 023:023 وليس 23:23 واخيرا يتم ارجاع الناتج الى الدالة الرئيسية في البرنامج وهي main لتقوم بطباعة الناتج المرجع. 3- الدالة القلب في الخوارزمية
واخيرا ، نعرض الدالة المسؤولة عن ملأ علامات الاستفهام بشكل صحيح ، وهي دالة Recursive وقد تم شرح قصة الـ Recursive Method في المقالة التالية : PHP كود : //Recursive Function - دالة تستدعي نفسهايمكنكم تتبع الدالة سطرا سطرا لتعرفون كيف تعمل ، ولكن هذه الصورة تشرح لكم كيف تعمل بشكل بسيط جدا : Now s1 List Filed with all possible values ويتم استدعاء الدالة مرة اخرى لجلب جميع القيم المحتملة لs2 وتخزينها في الValues2 لست -- المشروع : [attachment=12776] تم - الرجاء من الجميع ارفاق السورس كود RE: [مسابقة الخوارزمية 3] - الجولة الثالثة - abulayth - 07-01-17 بارك الله فيك ومبروك للفائزين يعطيك الصحة |