Let's Learn it Together !

ِAn educational blog from FCIS'2011 students ..


تناولنا فى Online Judges --- Part 1 مقدمة عن تلك المواقع وانواع المسائل بها بصورة مختصرة.


فى هذا الجزء سوف نتناول باذن الله الاتى :
  • كيف يحدد ال Judge اذا كان الحل صحيحا أم لا ؟
  • نتائج ال Submissions كثيرة أفضلها Accepted .
  • الملاحظات التى يجب أخدها فى الاعتبار عند كتابة الكود بال ++C.
  • بعض الأخطاء الشائعة.
  • نصائح العامة.


أولا كيف يحدد ال Judge اذا كان الحل صحيحا أم لا :


بطريقة ما يقوم ال Judge بتشغيل كودك ويقوم باعطائه مجموعة من ال Test Cases للمسألة التى تقوم بحلها, حيث أن ال Judge لديه مجموعة من ال Test Cases لكل مسألة بخلاف التى تظهر فى المسألة ... بعد ادخال كل ال Input الى كودك يتم حفظ كل ال Output فى File, ثم يتم مقارنة ذلك ال File باخر به جميع ال Output الصحيحة لل Input المدخل, اذا تطابق الملفان يكون الحل الذى أرستله صحيحا ويرسل لك ال Judge كلمة "Accepted" ... واذا كان هناك اختلاف ولو مقدار مسافة واحدة " " يرسل لك ما يفيد ان حلّك خطأ.

ولذلك يجب أن يغطى حلّك على الأقل ال Sample Input و ال Sample Output المعطاة فى المسألة, ولكن هذا لا يعنى بالضرورة انك أرسلت الحل الصحيح , فى بعض الأحيان يكون هناك حالات "Cases" لم يتم أخذها فى الاعتبار"Not Handled".


ثانيا نتائج ال Submissions كثيرة أفضلها Accepted :


  • Accepted: النتيجة الوحيدة التى تعنى أن حلك صحيح .
  • Presentation Error: تعنى أنه "ربما" يكون هنا خطأ فى عرض ال Output ... قد تكون هناك مسافات زائدة أو غير موجودة.
  • Time Limit Exceeded: الحل الذى أرسلته يأخد وقت أكثر من المطلوب, قد يكون ال Algorithm الذى تستخدمه بطئ, أو انك تورطت فى Infinite Loop.
  • Memory Limit Exceeded: الحل الذى أرسلته يأخد مساحة أكثر من المطلوب.
  • Wrong Answer: الحل الذى أرسلته غير صحيح قد تكون لم تنتبه الى بعض ال Special Cases أو انك تفكر بطريقة خاطئة من البداية.
  • Runtime Error: يوجد input يؤدى الى عمل Crash للبرنامج ... وفى الغالب يكون سببها فى ال ++C هو عمل Access لمكان غير موجود بال Array أو غيرها.
  • Compile Error: ال Judge لا يستطيع عمل Compile للكود وقد يكون السبب انك استخدمت أشياء ليست Standard.


ثالثا الملاحظات التى يجب أخذها فى الاعتبار عن كتابة الكود بال ++C :


  • لا تستخدم () void main أبدا ... استخدم () int main و return 0 فى نهاية ال main.
  • لا تستخدم Libraries ليست Stranded فى لغة ال ++C مثل conoio.h, ستجد هناا جميع ال Standard Libraries.
  • فى بعض الأحيان يكون مطلوبا فى المسألة أن تأخذ ال Input حتى النهاية End Of File "EOF" ... وهذا يعنى انك عند كتابة الكود يجب ان تضع فى اعتبارك انك ستأخذ Input ثم تظهر ال Output وتأخد Input أخر بدون اغلاق البرنامج ثم تظهر Output وهكذا الى ما لا نهاية ... ولكن كيف يمكن لل Judge اغلاق البرنامج ؟؟؟
يتم ذلك عن طريق ادخال Special Character وهو "Ctrl + C" وبهذا ال Character يعرف البرنامج ان ال Input قد انتهى.


رابعا بعض الأخطاء الشائعة :


  • لا تكتب أى حرف زائد عن المطلوب ولا حتى Space, بعض المبرمجين فى البداية يكتبون "Please Enter Input" وقبل ال Output يكتبون "The Output is", وهناك من يكتب اسمه فى نهاية البرنامج ... ولكن هذه الأشياء تغضب ال Judge كثيرا وتؤدى ال Wrong Answer بكل تأكيد.
  • فى المسائل التى يكون ال Input فيها عبارة عن أرقام تأكد جيدا من ال Limit وجرب أكبر رقم فى ال Limit وأصغر رقم ... وجرّب أرقام سالبة ان كانت داخل ال Limit.
  • فى المسائل التى يكون ال Input فيها عبارة عن Strings تأكد أن كودك يعمل أذا أدخلت String فارغ ... واذا كنت تستخدم Array Of Character فتأكد انك تحجز مساحة كافية.
  • فى بعض المسائل يكون ال Input أرقام مساحتها أكبر من مساحة ال integer وبالتالى اذا استخدمتها فستحصل Wrong Answer لذا استخدم long long اذا كنت فى حاجة اليهما.
  • أحيانا فى بعض المسائل يكون ال Input أرقام مساحتها أكبر من مساحة كل ال Data Types وبالتالى يجب أن تستخدم String وتتعامل معه معاملة الأرقام ... ولكن كيف ؟؟ (دى لعبتك انته بقى).


خامسا نصائح عامة :


  • من الأفضل أن تبدأ بحل المسائل التى يكون بها نسبة حلّ أعلى لأنها تكون أسهل وتكون قابلة للحلّ أكثر من غيرها.
  • اذا كان هناك Limit لل Input فتأكد أن ال Judge لن يخدعك ويدخل Input خارج ال Limit ... مثلا اذا قال أنه سيدخل أرقام بين ال 1 - 10 فلن يدخل أرقام سالبة أو صفر أو أرقام أكبر من 10.
  • لا تستخدم float أو double الا اذا كنت بحاجة اليها .. لأن ال float أبطأ بكثير من ال int.
  • دائما أحتفظ بكل الأكواد التى تكتبها .. تأكد أنك ستحتاجها فى يوم من الأيام.
  • ضع فى أعتبارك وانت تكتب كود انك انت أو غيرك سوف تحتاج الى ذلك الكود فى يوم من الأيام, لذلك أكتب كود "نظيف" واستخدم اسماء Variables واضحة وتعبر عن معناها واستخدم ال Comments كلما أمكن.
  • بعض المسائل تكون مشهورة ولها Algorithm معين ... ابحث على الانترنت واقرأ المقالات وأكتب الكود بيدك.
  • لا تتوقع أن تحصل على Accepted من أول مرة لذلك لا تيأس وحاول مرة أخرى وتأكد من ال Special Cases وجرب Cases مع أصدقائك, وتأكد أن متعة الحصول على Accepted ستنسيك أى تعب أو احباط.

ملحوظة : هنا نسخة PDF من المقال.

0 comments:

Post a Comment