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 من المقال.


ما هى ال Online Judges ؟؟


مواقع تحتوى على مشاكل أو مسائل "Problems" تتطلب حلّها برمجيا ومن ثم تقدم الكود للموقع "
Submit ", وبعد ذلك يحدد الموقع هل حلك صحيح أم خطأ.



ما هى أنواع المسائل التى تحتوى عليها ال Online Judges ؟؟

أشهر أنواع المسائل هى :
  • Ad hoc : مسائل لا تحتاج الى معرفة Algorithm معين أو ان تكون على دراية عميقة بأحد العلوم .. وتعتمد فى الأساس على الذكاء وهى أشهر أنواع المسائل, وأحيانا كثيرة تكون الأسهل.
  • simulation : خطوات ويجب عليك تنفيذها برمجيا .. تعتمد على قدرتك فى التعامل مع لغة البرمجة التى تستخدمها, وهى من أشهر أنواع المسائل أيضا.
وهناك أنواع أخرى عديدة مثل
  • Math : ستتعلم منها أشياء جديدة أكثر من استخدامك لقواعد ال Math التى تعرفها.
  • Number Theory : على رأى أحد ال ACMers "هتنظف دماغك".
  • Sorting : ترتيب الأشياء بأقل وقت ممكن وأقل "Memory" ممكنة يجعل الحياة أسهل.
  • Brute Force Method : أحيانا يكون استخدامها متاحا, عندما يكون لديك الوقت والمساحة (Memory) المناسبة.
  • Backtracking : المطلوب ايجاد كل الحلول الممكنة وأختيار الحل الأفضل ... وأحيانا ايجاد أول حل صحيح.
  • Dynamic Programing : تقسيم المشكلة الكبيرة الى مشاكل أصغر, ستتعلم منها ان المشاكل أحيانا تكون أبسط مما قد تبدو.
  • Greedy : ستعلمك الطمع والجشع :D.
  • Graph : صعوبتها فى ال implementation ودراسة ال Algorithms لحل مسائلها أسهل ... وحل مسألة منها يرفع الروح المعنوية جداا.


ما هى لغات البرمجة التى يمكن كتابة الكود بها ؟؟؟
  • ++C وهى من أكثر اللغات استخداما.
  • C
  • Java
بعض المواقع تتيح لغات أخرى بالاضافة الى ما سبق مثل
  • Pascal
  • Fortran
  • GCC
  • ANCII
وقليلا ما تتيح بعض المواقع لغات مثل #C.



أمثلة لل Online Judges

وان شاء الله فى تدوينات قادمة سيتم شرح كيفية التعامل مع كل موقع من المواقع السابقة و مميزات كل منهم وأيضا بعض النصايح لل ACMers الجدد (ACMers المستقبل).

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

Question


Find an O(n) algorithm for finding an integer that occurs only once in a list which has all other integers occurring exactly twice. So, in this list of integers, each integer repeats exactly twice, except one. To find that one, what is the best algorithm?


List: 2 2 7 3 1 7 1.

Answer: 3.



Answer


Just XOR all of them…


a XOR b XOR a XOR c XOR b XOR c ... XOR z
= (a XOR a) XOR (b XOR b) XOR ... XOR z
= 0 XOR 0 XOR ... XOR z
= z



Thanks to F.M.A.R. who sent me this problem.

This is the pdf version of this article.