المسابقات والمنصّات

المنصّات الإلكترونية

توجد العديد من المواقع الإلكترونية (تُعرف غالبًا باسم مقيم إلكتروني أو Online Judges) التي يمكنك من خلالها المشاركة في المسابقات أو حل المسائل لغرض التدريب فقط. تُعد منصة Codeforces المنصة الأشهر من بينها، إذ تستضيف مسابقات أسبوعية مناسبة لجميع المستويات، كما تحتوي على مكتبة ضخمة من المسائل يمكن استخدامها للممارسة.

توجد أيضًا منصّات أخرى مثل USACO التي تستضيف المسابقات كل شهرين تقريبًا، وتحتوي كذلك على مجموعة كبيرة من المسائل الموجهة للمنافسين ذوي الخبرة الأعلى. أما موقع CSES فهو لا يستضيف مسابقات، ولكنه يضم مكتبة ممتازة من المسائل مناسبة لتعلّم المواضيع المختلفة.

البدء باستخدام Codeforces

في هذا القسم سنناقش الخطوات التفصيلية لإنشاء حساب على منصة Codeforces وحل أوّل مسألة.

التسجيل

بعد فتح موقع “codeforces.com”، اضغط على زر Register في الزاوية العلوية اليمنى من الصفحة.

Registration button

املأ البيانات المطلوبة واختر كلمة مرور قوية. اختر اسم مستخدم (handle) يُعبّر عن هويتك، علمًا أنك لن تتمكّن من تغييره إلا مرة واحدة في السنة. ملاحظة: يجب التسجيل باستخدام بريدك الإلكتروني الحقيقي، ولا يُنصح باستخدام بريد مؤقت، لأنك ستحتاج إلى التحقق من الحساب لاحقًا.

التحقّق

بعد إتمام التسجيل، افتح بريدك الإلكتروني للتحقق من الحساب. بعد الانتهاء من هذه الخطوة، يمكنك تسجيل الدخول بنجاح.

مسألة Watermelon؟

الآن يمكننا البدء بحل أول مسألة. في الشريط العلوي، يمكننا رؤية زر Problemset الذي يأخذنا إلى مكتبة المسائل الخاصة بـ Codeforces، حيث يمكننا عرض جميع المسائل التي ظهرت في المسابقات السابقة ومحاولة حلها.

Topbar

تمثّل آخر عمودين في جدول المسائل درجة الصعوبة وعدد الأشخاص الذين حلّوا المسألة.

Problemset

عند الضغط على أحد الرمزين في رأس الجدول، يمكنك ترتيب المسائل حسب تلك الخاصية. تُعبّر درجة الصعوبة عن رقم مضاعف لـ \(100\) ويتراوح ضمن المدى \([800, 3500]\).

بعد ترتيب المسائل تصاعديًا حسب درجة الصعوبة، ستجد المسألة “Watermelon”.

Sorted Problemset

معلومة ممتعة: إنها أيضًا أكثر المسائل حلاً على المنصة.

نص المسألة (Statement)

يصف هذا القسم المشكلة والمتطلبات. في الأعلى يظهر عنوان المسألة بالإضافة إلى حدود الزمن والذاكرة المسموح بها.

تطلب المسألة كتابة برنامج يقرأ عددًا صحيحًا w من الإدخال، ويتحقق مما إذا كان يمكن تمثيل هذا العدد كمجموع لعددين صحيحين زوجيين موجبَين a وb، ثم يطبع “Yes” أو “No”.

قسم الإدخال (Input)

يوضّح هذا القسم كيفية إعطاء الإدخال بالضبط، وترتيبه، وأنواع البيانات المطلوبة. قد لا يُذكر صراحة أنك تحتاج إلى استخدام long long أو double، لكن يمكن استنتاج ذلك من مدى القيم الممكنة للمتغيّر.

على سبيل المثال، إذا ورد في النص أنّ \(-10^9 \le x \le 10^9\) فإنّ نوع int يكفي، أما إذا ورد \(-10^{18} \le x \le 10^{18}\) فيجب استخدام long long.

قسم الإخراج (Output)

يوضح هذا القسم كيفية طباعة النتيجة. على سبيل المثال، ما إذا كانت الأحرف يجب أن تكون كبيرة أو صغيرة، أو ما إذا كان يجب الفصل بين المخرجات بمسافات أو أسطر جديدة، أو حتى عدد الأرقام العشرية المطلوب طباعتها عند التعامل مع الأعداد العشرية.

الفكرة الخاطئة

إذا جرّبنا بعض الأعداد يدويًا، قد نلاحظ نمطًا معينًا؛ فعلى سبيل المثال، إذا كان w عددًا فرديًا، فمن المستحيل أن يكون مجموع a وb عددًا فرديًا لأنّ even + even = even.

إذن، فكرتنا الأولى ستكون: إذا كان w فرديًا اطبع “No”، وإلا اطبع “Yes”.

للأسف، هذه الفكرة غير صحيحة. المثال المضاد هو w = 2، إذ لا يمكن تمثيل العدد 2 كمجموع عددين زوجيين موجبين.

النهج الصحيح

بالنسبة لأي عدد أكبر من 2، يمكن ببساطة اختيار a = 2 و b = w - 2، وستعمل هذه الطريقة لأي عدد زوجي أكبر من 2. أما الأعداد الفردية فقد أثبتنا سابقًا استحالة تحقيق الشرط فيها.

ترجمة الفكرة إلى كود

بعد الوصول إلى الحل الصحيح، يجب التعبير عنه بالكود. أولاً نقرأ الإدخال، ثم نطبّق المنطق، ثم نطبع الإخراج.

#include<iostream>
using namespace std;

int main () {
    int w;
    cin >> w;

    if (w == 2 || w % 2 == 1) cout << "No";
    else cout << "Yes";
}

إرسال الحل (Submitting the Solution)

في أعلى الصفحة، أسفل الشريط العلوي، سنجد الخيارات التالية:

Problem Topbar

عند الضغط على Submit، سيتم نقلك إلى الصفحة التالية:

Submission page

أول ما يجب التأكد منه هو اختيار اللغة الصحيحة، وبما أننا نكتب بلغة C++ يجب تغيير خيار اللغة إلى نسخة صحيحة من C++. ملاحظة: الإعداد الافتراضي يكون عادةً على C مما يتسبب في حصول المبتدئين على compilation error في محاولتهم الأولى.

بعد ذلك، انسخ الكود والصقه في خانة Source code، ثم اضغط على Submit.

بعد الإرسال، سيتم تحويلك إلى صفحة Submissions التي ستُظهر نتيجة التقييم (verdict) الخاصة بإرسالك.

Submission status

النتائج المحتملة هي:

  • Accepted – أي أن الحل اجتاز جميع الاختبارات بنجاح.
  • Wrong Answer – أي أن الحل طبع نتيجة خاطئة في أحد الاختبارات.
  • Time Limit Exceeded – أي أن الحل استغرق وقتًا أطول من المسموح به.
  • Memory Limit Exceeded – أي أن الحل استهلك ذاكرة أكبر من الحد المسموح.
  • Runtime Error – أي أن هناك خطأ حدث أثناء تنفيذ البرنامج.

عادةً لا يمكنك الاطلاع على الاختبار الذي فشل فيه برنامجك، فقد يكون كبيرًا جدًا أو محجوبًا من قِبل منظّمي المسابقة، وبالتالي يكون التحدي في اكتشاف الخطأ بنفسك.