A programming contest or programming competition is a competition that ranks participants by testing their ability to solve one or more computer programming tasks. Many people participate in programming competitions as a hobby, which is referred to as competitive programming.
Many well-known programming competitions test competitors exclusively on their ability to formulate and implement algorithms that are judged on the basis of their efficiency or optimality. Such programming competitions may be referred to as algorithmic competitions and include:
- International Olympiad in Informatics (IOI) and various national informatics olympiads such as the USA Computing Olympiad (USACO)
- ACM International Collegiate Programming Contest (ICPC)
- TopCoder algorithm contests, including approximately biweekly Single Round Matches (SRMs) and the annual TopCoder Open (TCO)
- Google Code Jam
- CodeForces contests
There are also other types of programming competitions in which competitors are given more open-ended tasks and These programming competitions test competitors' ability to formulate and implement algorithms in order to solve given problems efficiently. There are also programming competitions that are more open-ended, such as the International Obfuscated C Code Contest, in which the goal is to write a creatively obfuscated C program, but, other than a set of general rules, no specification is given for the program's behaviour.
Success in algorithmic competitive programming requires a unique set of skills and techniques that differs, but is not disjoint from, the set of skills and techniques required to succeed in large-scale software projects. An algorithmic competitive programmer must have a deep and broad understanding of algorithms and data structures and must be able to implement complex algorithms and data structures quickly and accurately. On the other hand, an algorithmic competitive programmer does not need to abide by principles of code readability or maintainability, to understand the needs of users, or to communicate with non-technical collaborators. This has led to some criticism of competitive programming, as some people consider competitive programming to be a fatuous endeavour that distracts programmers from developing practical skills.
Many websites, known as online judges, collect extensive archives of algorithmic problems used in past contests. Users can attempt to solve the problems and submit their solutions to the website to be automatically graded. This is a common way to practise for future programming competitions.
Algorithmic programming competitions and the techniques commonly exploited to solve algorithmic programming contest problems form the main topic of PEGWiki.