برمجة تنافسية

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

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

تاريخ 
واحدة من أقدم المسابقات المعروفة هي مسابقة البرمجة الجماعية الدولية (ICPC) التي نشأت في السبعينيات، ونمت لتشمل 88 دولة في نسختها لعام 2011.

من عام 1990 إلى عام 1994 ، أدار أوين أستراشان وفيفك خيرا وديفيد كوتز واحدة من أولى مسابقات البرمجة الموزعة على الإنترنت المستوحاة من مسابقة البرمجة الجماعية الدولية. 

نما الاهتمام بالبرامج التنافسية على نطاق واسع منذ عام 2000 إلى عشرات الآلاف من المشاركين وهو مرتبط بقوة بنمو الإنترنت مما يسهل إجراء المسابقات الدولية عبر الإنترنت، مما يلغي المشكلات الجغرافية.

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

بغض النظر عن فئة المشكلة، يمكن تقسيم عملية حل المشكلة إلى خطوتين رئيسيتين: بناء خوارزمية فعالة، وتنفيذ الخوارزمية بلغة برمجة مناسبة (تختلف مجموعة لغات البرمجة المسموح بها من مسابقة إلى أخرى). هاتان هما أكثر المهارات التي يتم اختبارها شيوعًا في مسابقات البرمجة.

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

الحكام عبر الإنترنت هم بيئات عبر الإنترنت يتم فيها إجراء الاختبار. لدى الحكام عبر الإنترنت قوائم ترتيب تُظهر المستخدمين الذين لديهم أكبر عدد من الحلول المقبولة و/أو أقصر وقت تنفيذ لمشكلة معينة.

مسابقات بارزة

مسابقات الخوارزمية 

في معظم المسابقات المذكورة أعلاه، عادة ما يتم تنظيم المسابقات في عدة جولات. عادة ما تبدأ بجولات عبر الإنترنت، والتي تنتهي في الجولة النهائية في الموقع. يحصل أصحاب الأداء الأفضل في IOI و ICPC على ميداليات ذهبية وفضية وبرونزية. في المسابقات الأخرى، يتم منح جوائز نقدية لأفضل المتسابقين. تجذب المسابقات أيضًا اهتمام القائمين بالتوظيف من العديد من شركات البرامج والإنترنت، والتي غالبًا ما تصل إلى المنافسين الذين لديهم عروض عمل محتملة.

ذكاء اصطناعي وتعلم الآلة 

 Kaggle - مسابقات علوم البيانات والتعلم الآلي.
 CodeCup - مسابقة الذكاء الاصطناعي للعبة اللوحة التي تقام سنويًا منذ عام 2003. يتم نشر قواعد اللعبة في سبتمبر وتقام البطولة النهائية في يناير.   
 Google AI Challenge - مسابقات نصف سنوية للطلاب استمرت من 2009 إلى 2011.
 Halite  - تحدٍ لبرمجة الذكاء الاصطناعي برعاية Two Sigma و Cornell Tech و  وجوجل. 
 كأس روسيا للذكاء الاصطناعي - مسابقة برمجة ذكاء اصطناعي مفتوحة.
 CodinGame - تستضيف مسابقات برمجة الروبوتات الموسمية.

مسابقات تركز على تقنيات المصادر المفتوحة

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

الفوائد والنقد 
قد تؤدي المشاركة في مسابقات البرمجة إلى زيادة حماس الطلاب لدراسات علوم الكمبيوتر. كما تعمل المهارات المكتسبة في مسابقات البرمجة الشبيهة بلجنة الكابلات الدولية على تحسين الآفاق الوظيفية، حيث تساعد في اجتياز "المقابلات الفنية"، والتي تتطلب غالبًا من المرشحين حل مشكلات البرمجة المعقدة والخوارزميات في الحال.

كانت هناك أيضًا انتقادات للبرمجة التنافسية، خاصة من مطوري البرامج المحترفين. إحدى النقاط المهمة هي أن العديد من مسابقات البرمجة سريعة الخطى تعلم المنافسين عادات البرمجة السيئة وأسلوب الكود (مثل الاستخدام غير الضروري لوحدات الماكرو، ونقص تجريد البرمجة كائنية التوجه والتعليقات، واستخدام أسماء متغيرة قصيرة، إلخ. ).   أيضًا ، من خلال تقديم ألغاز خوارزمية صغيرة فقط مع حلول قصيرة نسبيًا ، فإن مسابقات البرمجة مثل ICPC و IOI لا تعلم بالضرورة مهارات وممارسات هندسة البرمجيات الجيدة ، حيث تحتوي مشاريع البرامج الحقيقية عادةً على عدة آلاف من أسطر التعليمات البرمجية ويتم تطويرها بواسطة فرق كبيرة على مدى فترات طويلة من الزمن.  صرح بيتر نورفيج أنه بناءً على البيانات المتاحة ، فإن كونك فائزًا في مسابقات البرمجة يرتبط سلبًا بأداء المبرمج في وظيفته في Google (على الرغم من أن الفائزين في المسابقة لديهم فرص أعلى في التوظيف).  صرح نورفيج لاحقًا أن هذا الارتباط لوحظ في مجموعة بيانات صغيرة ، ولكن لا يمكن تأكيده بعد فحص مجموعة بيانات أكبر. 

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

في الأدب 

 حليم ، س ، حليم ، ف. (2013). البرمجة التنافسية 3: الحد الأدنى الجديد لمسابقات البرمجة . لولو.
 لاكسونن ، أ. (2017). دليل البرمجة التنافسية (موضوعات البكالوريوس في علوم الكمبيوتر). شام: Springer International Publishing.
 كوستكا ، ب. (2021). البرمجة الرياضية في الممارسة. جامعة فروتسواف.

أنظر أيضا 

 هاكاثون

مراجع

روابط خارجية 

 أداة مفتوحة المصدر استخدمت لإدارة والتحكم في الأولمبياد الدولي للمعلوماتية.

برمجة