# Programação competitiva

A programação competitiva ou programação esportiva é um esporte mental que envolve participantes que tentam programar de acordo com as especificações fornecidas. As competições geralmente são realizadas pela Internet ou por uma rede de área local. A programação competitiva é reconhecida e apoiada por várias empresas multinacionais de software e Internet, como o Google e a Meta.
Uma competição de programação geralmente envolve o anfitrião que apresenta um conjunto de problemas lógicos ou matemáticos, também conhecidos como quebra-cabeças ou desafios, aos participantes (que podem variar em número de dezenas ou mesmo centenas a vários milhares). Os participantes devem escrever programas de computador capazes de resolver esses problemas. O julgamento é baseado principalmente no número de problemas resolvidos e no tempo gasto para escrever soluções bem-sucedidas, mas também pode incluir outros fatores (qualidade do resultado produzido, tempo de execução, uso de memória, tamanho do programa etc.).

## História

Um dos concursos mais antigos conhecidos é o International Collegiate Programming Contest (ICPC), que teve origem na década de 1970 e cresceu para incluir 88 países em sua edição de 2011.
De 1990 a 1994, Owen Astrachan, Vivek Khera e David Kotz realizaram um dos primeiros concursos de programação distribuídos e baseados na Internet, inspirado no ICPC.
O interesse em programação competitiva cresceu muito desde 2000, chegando a dezenas de milhares de participantes, e está fortemente ligado ao crescimento da Internet, que facilita a realização de competições internacionais on-line, eliminando problemas geográficos.

## Visão geral

O objetivo da programação competitiva é escrever o código-fonte de programas de computador capazes de resolver determinados problemas. A grande maioria dos problemas que aparecem nos concursos de programação é de natureza matemática ou lógica. Normalmente, essas tarefas pertencem a uma das seguintes categorias: combinatória, teoria dos números, teoria dos grafos, teoria dos jogos algorítmicos, geometria computacional, análise de cordas, matemática discreta e estruturas de dados. Os problemas relacionados à programação por restrições e à inteligência artificial também são populares em determinadas competições.
Independentemente da categoria do problema, o processo de resolução de um problema pode ser dividido em duas etapas gerais: construção de um algoritmo eficiente e implementação do algoritmo em uma linguagem de programação adequada (o conjunto de linguagens de programação permitidas varia de acordo com o concurso). Essas são as duas habilidades mais comumente testadas em competições de programação.
Na maioria dos concursos, o julgamento é feito automaticamente por máquinas host, comumente conhecidas como juízes. Toda solução enviada por um participante é executada pelo juiz em relação a um conjunto de casos de teste (geralmente secretos). Normalmente, os problemas do concurso têm um sistema de marcação tudo-ou-nada, o que significa que uma solução é “aceita” somente se produzir resultados satisfatórios em todos os casos de teste executados pelo juiz e é rejeitada caso contrário. Entretanto, alguns problemas do concurso podem permitir pontuação parcial, dependendo do número de casos de teste aprovados, da qualidade dos resultados ou de algum outro critério especificado. Algumas outras competições exigem apenas que o competidor envie a saída correspondente aos dados de entrada fornecidos e, nesse caso, o juiz só precisa analisar os dados de saída enviados.
Os juízes on-line são ambientes on-line nos quais os testes são realizados. Os juízes on-line têm listas de classificação que mostram os usuários com o maior número de soluções aceitas e/ou o menor tempo de execução para um determinado problema.

## Benefícios e críticas

A participação em concursos de programação pode aumentar o entusiasmo dos alunos pelos estudos de ciência da computação. As habilidades adquiridas em concursos de programação do tipo ICPC também melhoram as perspectivas de carreira, pois ajudam a passar nas “entrevistas técnicas”, que geralmente exigem que os candidatos resolvam problemas complexos de programação e algoritmos na hora.
Também houve críticas à programação competitiva, especialmente por parte de desenvolvedores de software profissionais. Um ponto crítico é que muitos concursos de programação em ritmo acelerado ensinam aos competidores hábitos de programação e estilo de código ruins (como uso desnecessário de macros, falta de abstração e comentários de OOP, uso de nomes curtos de variáveis etc.). Além disso, ao oferecer apenas pequenos quebra-cabeças algorítmicos com soluções relativamente curtas, concursos de programação como o ICPC e o IOI não ensinam necessariamente boas habilidades e práticas de engenharia de software, já que os projetos de software reais normalmente têm muitos milhares de linhas de código e são desenvolvidos por grandes equipes durante longos períodos de tempo. Peter Norvig afirmou que, com base nos dados disponíveis, o fato de ser vencedor de concursos de programação estava correlacionado negativamente com o desempenho de um programador em seu emprego no Google (embora os vencedores do concurso tivessem mais chances de serem contratados). Norvig afirmou posteriormente que essa correlação foi observada em um pequeno conjunto de dados, mas que não pôde ser confirmada após o exame de um conjunto de dados maior.
Outro sentimento é que, em vez de “desperdiçar” seu tempo em competições excessivas, resolvendo problemas com soluções conhecidas, os programadores de alto nível deveriam investir seu tempo na solução de problemas do mundo real.

## Literatura

* Halim, S., Halim, F. (2013). Competitive Programming 3: The New Lower Bound of Programming Contests. Lulu.
* Laaksonen, A. (2017). Guide to Competitive Programming (Undergraduate Topics in Computer Science). Cham: Springer International Publishing.
* Xu, X. (2020) The development, prosperity and decline of Olympic in Informatics. Publicado online.
* Kostka, B. (2021). Sports programming in practice. Universidade de Wrocław.