Programare competitivă - Competitive programming
Programarea competitivă este un sport mental desfășurat de obicei prin Internet sau o rețea locală , implicând participanții care încearcă să programeze conform specificațiilor furnizate. Concurenții sunt numiți programatori de sport . Programarea competitivă este recunoscută și susținută de mai multe companii multinaționale de software și Internet, precum Google și Facebook .
Un concurs de programare presupune, în general, prezentarea de către gazdă a unui set de probleme logice sau matematice , cunoscute și sub denumirea de puzzle-uri , concurenților (care pot varia ca număr de la zeci la câteva mii), iar concurenții trebuie să scrie programe de calculator capabile să rezolve fiecare problemă. . Judecarea se bazează în principal pe numărul de probleme rezolvate și pe timpul petrecut pentru scrierea soluțiilor de succes, dar poate include și alți factori (calitatea rezultatelor produse, timpul de execuție, dimensiunea programului etc.)
Istorie
Unul dintre cele mai vechi concursuri cunoscute este ICPC , care a apărut în anii 1970 și a crescut pentru a include 88 de țări în ediția sa din 2011.
Din 1990 până în 1994, Owen Astrachan , Vivek Khera și David Kotz au organizat unul dintre primele concursuri de programare distribuite, bazate pe internet, inspirate de ICPC.
Interesul pentru programarea competitivă a crescut considerabil începând cu anul 2000 și este strâns legat de creșterea internetului, ceea ce facilitează organizarea online de concursuri internaționale, eliminând problemele geografice.
Prezentare generală
Scopul programării competitive este de a scrie codul sursă al programelor de calculator care sunt capabile să rezolve problemele date. Marea majoritate a problemelor care apar în concursurile de programare sunt de natură matematică sau logică. Astfel de sarcini tipice aparțin uneia dintre următoarele categorii: combinatorie , teoria numerelor , teoria grafurilor , teoria jocurilor algoritmice , geometrie computațională , analiza șirurilor și structurile de date . Problemele legate de programarea cu constrângeri și inteligența artificială sunt, de asemenea, populare în anumite competiții.
Indiferent de categoria problemei, procesul de rezolvare a unei probleme poate fi împărțit în două etape mari: construirea unui algoritm eficient și implementarea algoritmului într-un limbaj de programare adecvat (setul de limbaje de programare permis variază de la concurs la concurs). Acestea sunt cele două abilități testate cel mai frecvent în competițiile de programare.
În majoritatea concursurilor, jurizarea se face automat de către mașini gazdă, cunoscute în mod obișnuit ca arbitri. Fiecare soluție prezentată de un concurent este aplicată judecătorului împotriva unui set de cazuri de testare (de obicei secrete). În mod normal, problemele de concurs au un sistem de notare „tot sau nimic”, ceea ce înseamnă că o soluție este „Acceptată” numai dacă produce rezultate satisfăcătoare în toate cazurile de testare conduse de judecător și respinsă în caz contrar. Cu toate acestea, unele probleme ale concursului pot permite punctaj parțial, în funcție de numărul de cazuri de testare trecute, de calitatea rezultatelor sau de alte criterii specificate. Unele alte concursuri necesită doar ca concurentul să trimită rezultatul corespunzătoare datelor de intrare date, caz în care judecătorul trebuie să analizeze doar datele de ieșire transmise.
Judecătorii online sunt medii online în care au loc testarea. Judecătorii online au liste de clasare care arată utilizatorii cu cel mai mare număr de soluții acceptate și/sau cel mai scurt timp de execuție pentru o anumită problemă.
Competiții notabile
Există două tipuri de formate de competiție: pe termen scurt și pe termen lung. Fiecare rundă de competiție pe termen scurt durează de la 1 la 5 ore. Competițiile pe termen lung pot dura de la câteva zile până la câteva luni.
Termen scurt
- International Collegiate Programming Contest (ICPC) – una dintre cele mai vechi competiții, pentru studenții universităților în grupuri de câte 3 persoane fiecare
- Olimpiada Internațională de Informatică (IOI) – una dintre cele mai vechi competiții, pentru elevii de liceu
- American Computer Science League (ACSL) – competiție de informatică cu porțiuni scrise și de programare, pentru elevii de gimnaziu/liceu
- CodeChef – competiție desfășurată din 2009, există trei concursuri organizate în fiecare lună și o competiție anuală numită CodeChef SnackDown
- Runda Codeforces – de obicei, concurs de două ore, desfășurat în fiecare săptămână
- Facebook Hacker Cup – competiție desfășurată din 2011, oferită și sponsorizată de Facebook
- HackerRank – competiții multiple
- Gridwars – patru competiții organizate între 2003 și 2004.
- Google Code Jam – competiție organizată din 2003, furnizată și sponsorizată de Google
- IEEEXtreme Programming Competition – competiție anuală pentru studenții IEEE, organizată din 2006 de IEEE .
- Topcoder Open (TCO) – Competiție de algoritmi organizată din 2001 de Topcoder
În majoritatea competițiilor de mai sus, deoarece numărul concurenților este destul de mare, competițiile sunt de obicei organizate în mai multe runde. De obicei, necesită participarea online la toate rundele, cu excepția ultimei, care necesită participarea la fața locului. O excepție specială de la aceasta este IEEEXtreme, care este o competiție anuală de programare virtuală de 24 de ore. Performanții de top de la IOI și ICPC primesc medalii de aur, argint și bronz, în timp ce în celelalte concursuri, premii în bani sunt acordate primilor clasați. De asemenea, atingerea locurilor de top în tabelele de scor ale unor astfel de competiții poate atrage interesul recrutorilor de la companii de software și de internet.
Termen lung
- Săptămâna codului HackerRank
- Concurs de programare ICFP – competiție anuală de 3 zile desfășurată din 1998 de către Conferința Internațională de Programare Funcțională
- Topcoder Marathon Meciuri
- Codechef Long Challenges - desfășurate în fiecare lună - durează până la 10 zile
Inteligența artificială și învățarea automată
- Kaggle – competiții de învățare automată.
- CodeCup – competiție de IA pentru jocuri de masă care se desfășoară anual din 2003. Regulile jocului sunt publicate în septembrie, iar turneul final are loc în ianuarie.
- Google AI Challenge – competiții bianuale pentru studenți care au avut loc între 2009 și 2011
- Halite – O provocare de programare AI sponsorizată de Two Sigma, Cornell Tech și Google
- Concurs deschis de programare cu inteligență artificială Russian AI Cup
Concursuri axate pe tehnologii open source
- Lista poate fi incompletă
| Numele concursului | Sponsor principal | Descriere | Alergând de când | Ora obișnuită | Următorul ciclu de aplicare | stare |
|---|---|---|---|---|---|---|
| Concurs de programare multi-agenți | Clausthal University of Technology împreună cu ateliere de lucru orientate către agenți | Competiție internațională anuală de programare pentru a stimula cercetarea în domeniul dezvoltării și programării sistemelor multi-agent . | 2005 | Sept | septembrie 2011 | Activ |
| Google Summer of Code | Google Inc. | Un program anual în care Google acordă burse pentru sute de studenți care finalizează cu succes un proiect de software gratuit/coding open-source solicitat în timpul verii. | 2005 | martie-aug | 23 martie - 3 aprilie | Activ |
| Concurs de participare extrem de deschisă Google | Google Inc. | Un concurs organizat de Google în 2007-2008, destinat elevilor de liceu. Concursul este conceput pentru a încuraja elevii de liceu să participe la proiecte open source. | 2007 | noiembrie-feb | Necunoscut | Necunoscut |
Concurs online și resurse de formare
Comunitatea de programare din întreaga lume a creat și întreținut mai multe resurse de internet dedicate programării competitive. Oferă concursuri independente cu sau fără premii minore. De asemenea, arhivele de probleme din trecut sunt o resursă populară pentru formarea în programarea competitivă. Există mai multe organizații care găzduiesc competiții de programare în mod regulat. Acestea includ:
| Nume | Descriere | Site-ul web |
|---|---|---|
| CodeChef | Menținută de Unacademy , găzduiește un concurs de 10 zile și câteva concursuri scurte în fiecare lună (unul IOI numit Lunchtime și altul ICPC numit Cook-Off) și oferă gratuit instituțiilor de învățământ o platformă de găzduire a concursului. Primii doi câștigători ai concursului lung câștigă premii în bani, în timp ce primii 10 la nivel global primesc un tricou. |
www |
| CodeCup | Competiție internațională anuală de programare AI pentru jocuri de societate organizată de Olimpiada Olandeză de Informatică din 2003. |
codecup |
| Codeforces | Resursă rusă, întreținută de Universitatea ITMO , care oferă în principal concursuri scurte frecvente (până la două pe săptămână). Caracteristici speciale: toate soluțiile sunt open source , capacitatea de a verifica corectitudinea soluțiilor altor concurenți în timpul „fazei de hacking”, concursuri virtuale, antrenamente etc. |
codeforces |
| CodinGame | Puzzle-uri (dificultăți în creștere), cod de golf . Găzduiește competiții online regulate ( provocări AI , probleme de optimizare ). |
www |
| HackerEarth | Companie cu sediul în Bangalore , India , care oferă un mediu de concurs online care vizează furnizarea de soluții de evaluare a recrutării. |
www |
| HackerRank | HackerRank oferă probleme de programare în diferite domenii ale informaticii. De asemenea, găzduiește Codesprint-uri anuale care ajută la conectarea programatorilor și a startup-urilor din Silicon Valley. |
hackerrank |
| Proiectul Euler | Colecție mare de probleme de matematică computațională (adică nu sunt legate direct de programare, dar necesită adesea abilități de programare pentru rezolvare). |
proiectuler |
| Topcoder | Resurse și companie din SUA, care organizează concursuri și oferă, de asemenea, probleme industriale ca un fel de muncă independentă; oferă zeci de concursuri scurte și câteva lungi („maratoane”) în fiecare an. Caracteristica specifică - participanții au șansa de a verifica corectitudinea soluțiilor altor concurenți după faza de codificare și înainte de testarea automată finală (așa-numita „faza de provocare”). |
www |
| Judecător online UVa | Conține peste 4.500 de probleme pentru exersare. Găzduiește competiții online regulate. Deschis în 1995, este unul dintre cele mai vechi astfel de site-uri. |
onlinejudge |
| SPOJ | Sistem polonez de arbitri online , care oferă o mulțime de probleme pentru antrenament și oferă o platformă pentru alți organizatori pentru a găzdui concursurile de programare. |
www |
| Deschide Kattis | Versiune publică a sistemului de management al concursului Kattis, cu o arhivă de peste 2600 de probleme. Kattis a fost dezvoltat pentru a ajuta cursurile de informatică, dar este și folosit pentru a găzdui competiții prestigioase, cum ar fi Finalele Mondiale ICPC. |
deschide |
| AtCoder | Cu sediul în Japonia, AtCoder oferă săptămânal concursuri de programare online. Concursurile sunt oferite în japoneză și engleză.
Din 2020, este una dintre cele mai populare platforme de acest gen. |
atcoder |
Participanți de seamă
Următoarea listă este formată din concurenții care au obținut rezultate semnificative la concursurile de programare și, într-o oarecare măsură, în cariera lor respectivă. Rețineți că această listă exclude persoanele (de exemplu, Mark Zuckerberg ) care ar putea avea succes în cariera lor, dar nu au avut rezultate semnificative în programarea competitivă:
- Gennady Korotkevich (turist)
- Petr Mitrichev (Petr)
- Makoto Soejima (rng_58), unul dintre foștii administratori și scriitori de probleme Topcoder și membru fondator al Atcoder.
- Tiancheng Lou (ACRush), de două ori câștigător Google Code Jam (2008 și 2009), co-fondator al Pony.ai
- Adam D'Angelo , CTO al Facebook și fondator Quora .
- Scott Wu (scott_wu), CTO al Lunchclub .
- Matei Zaharia (Matei), profesor asistent la Universitatea Stanford și fondator Databricks .
Beneficii și critici
Participarea la concursuri de programare poate crește entuziasmul studenților pentru studiile de informatică . Abilitățile dobândite în cadrul concursurilor de programare asemănătoare ICPC îmbunătățesc și perspectivele de carieră, deoarece ajută la promovarea „interviurilor tehnice”, care necesită adesea candidaților să rezolve pe loc probleme complexe de programare și algoritm.
Au existat, de asemenea, critici la adresa programării competitive, în special din partea dezvoltatorilor de software profesioniști. Un punct critic este că multe concursuri de programare cu ritm rapid îi învață pe concurenți obiceiuri proaste de programare și stilul de cod (cum ar fi utilizarea inutilă a macrocomenzilor , lipsa abstractizării și comentariilor OOP, utilizarea numelor scurte de variabile etc.). De asemenea, oferind doar puzzle-uri algoritmice mici cu soluții relativ scurte, concursurile de programare precum ICPC și IOI nu învață neapărat abilități și practici bune de inginerie software, deoarece proiectele software reale au, de obicei, multe mii de linii de cod și sunt dezvoltate de echipe mari peste perioade lungi de timp. Peter Norvig a afirmat că, pe baza datelor disponibile, a fi câștigător al concursurilor de programare a corelat negativ cu performanța unui programator la locul de muncă la Google (chiar dacă câștigătorii concursului aveau șanse mai mari de a fi angajați). Norvig a declarat ulterior că această corelație a fost observată pe un set mic de date, dar că nu a putut fi confirmată după examinarea unui set mai mare de date.
Totuși, un alt sentiment este că, în loc să-și „irosească” timpul în concurența excesivă prin rezolvarea problemelor cu soluții cunoscute, programatorii de nivel înalt ar trebui să investească mai degrabă timpul lor în rezolvarea problemelor din lumea reală.
Literatură
- Halim, S., Halim, F. (2013). Programare competitivă 3: noua limită inferioară a concursurilor de programare . Lulu.
- Laaksonen, A. (2017). Ghid de programare competitivă (Subiecte de licență în informatică). Cham: Springer International Publishing.
Vezi si
Referințe
linkuri externe
- Proiect open-source pentru derularea de concursuri
- Contest Management System Instrument open-source în Python pentru a rula și gestiona un concurs de programare pe un server IOI 2012 și IOI 2013 .