La programación competitiva es un deporte mental que generalmente se realiza a través de Internet o una red local , en el que los participantes intentan programar de acuerdo con las especificaciones proporcionadas. Los concursantes se denominan programadores deportivos . La programación competitiva es reconocida y respaldada por varias empresas multinacionales de software e Internet, como Google [1] [2] y Facebook . [3] Hay varias organizaciones que organizan concursos de programación de forma regular.
Una competencia de programación generalmente involucra al anfitrión presentando un conjunto de problemas lógicos o matemáticos , también conocidos como rompecabezas , a los concursantes (que pueden variar en número de decenas a varios miles), y se requiere que los concursantes escriban programas de computadora capaces de resolver cada problema. . La evaluación se basa principalmente en la cantidad de problemas resueltos y el tiempo dedicado a redactar soluciones exitosas, pero también puede incluir otros factores (calidad del resultado producido, tiempo de ejecución, tamaño del programa, etc.)
Historia
Uno de los concursos más antiguos que se conocen es el ICPC, que se originó en la década de 1970 y ha crecido hasta incluir 88 países en su edición de 2011.
De 1990 a 1994, Owen Astrachan , Vivek Khera y David Kotz llevaron a cabo uno de los primeros concursos de programación distribuidos basados en Internet inspirado en ICPC. [4]
El interés en la programación competitiva ha crecido [ cuantificar ] ampliamente desde 2000, y está fuertemente conectado con el crecimiento de Internet, lo que facilita la realización de concursos internacionales en línea, eliminando problemas geográficos.
Descripción general
El objetivo de la programación competitiva es escribir código fuente de programas informáticos que sean capaces de resolver determinados problemas. La gran mayoría de los problemas que aparecen en los concursos de programación son de naturaleza matemática o lógica. Estas tareas típicas pertenecen a una de las siguientes categorías: combinatoria , teoría de números , teoría de grafos , teoría de juegos algorítmicos , geometría computacional , análisis de cadenas y estructuras de datos . Los problemas relacionados con la programación de restricciones y la inteligencia artificial también son populares en ciertas competiciones.
Independientemente de la categoría del problema, el proceso de resolución de un problema se puede dividir en dos pasos amplios: construir un algoritmo eficiente e implementar el algoritmo en un lenguaje de programación adecuado (el conjunto de lenguajes de programación permitidos varía de un concurso a otro). Estas son las dos habilidades más probadas en los concursos de programación.
En la mayoría de los concursos, las máquinas anfitrionas, comúnmente conocidas como jueces, juzgan automáticamente. Cada solución presentada por un concursante se ejecuta en el juez contra un conjunto de casos de prueba (generalmente secretos). Normalmente, los problemas de concurso tienen un sistema de calificación de todo o nada, lo que significa que una solución es "Aceptada" solo si produce resultados satisfactorios en todos los casos de prueba ejecutados por el juez, y rechazada en caso contrario. Sin embargo, algunos problemas del concurso pueden permitir una puntuación parcial, según el número de casos de prueba aprobados, la calidad de los resultados o algunos otros criterios especificados. Algunos otros concursos solo requieren que el concursante envíe la salida correspondiente a los datos de entrada dados, en cuyo caso el juez solo tiene que analizar los datos de salida presentados.
Los jueces en línea son entornos en línea en los que se realizan las pruebas. Los jueces en línea tienen listas de clasificación que muestran a los usuarios con la mayor cantidad de soluciones aceptadas y / o el tiempo de ejecución más corto para un problema en particular. [5]
Competiciones notables
Hay dos tipos de formatos de competencia: a corto y largo plazo. Cada ronda de competición a corto plazo dura de 1 a 5 horas. Las competiciones de larga duración pueden durar desde unos días hasta unos meses.
Término corto
- Concurso Internacional de Programación Universitaria (ICPC): uno de los concursos más antiguos, para estudiantes de universidades en grupos de 3 personas cada uno.
- Olimpiada Internacional de Informática (IOI): una de las competencias más antiguas, para estudiantes de secundaria.
- Liga Estadounidense de Ciencias de la Computación (ACSL): competencia de ciencias de la computación con partes escritas y de programación, para estudiantes de secundaria / preparatoria
- CodeChef - competencia celebrada desde 2009, hay tres concursos cada mes [6] y una competencia anual llamada CodeChef SnackDown [7]
- Ronda de Codeforces : normalmente un concurso de dos horas, que se lleva a cabo todas las semanas [8]
- Facebook Hacker Cup : competencia celebrada a partir de 2011, proporcionada y patrocinada por Facebook
- HackerRank : varias competiciones [9]
- Gridwars : cuatro competiciones celebradas entre 2003 y 2004.
- Google Code Jam : concurso celebrado desde 2003, proporcionado y patrocinado por Google
- Competencia de programación IEEEXtreme [10] : competencia anual para miembros estudiantes de IEEE celebrada desde 2006 por IEEE .
- Topcoder Open (TCO): competencia de algoritmos organizada desde 2001 por Topcoder
En la mayoría de las competiciones anteriores, dado que el número de concursantes es bastante grande, las competiciones suelen organizarse en varias rondas. Por lo general, requieren participación en línea en todas las rondas excepto en la última, que requiere participación en el sitio. Una excepción especial a esto es IEEEXtreme, que es una competencia de programación virtual anual de 24 horas. Los mejores jugadores en IOI e ICPC reciben medallas de oro, plata y bronce, mientras que en los otros concursos, se otorgan premios en efectivo a los primeros clasificados. También llegar a los primeros lugares en las tablas de puntuación de tales competiciones puede atraer el interés de los reclutadores de empresas de software e Internet.
A largo plazo
- Semana del código de HackerRank [11]
- Concurso de programación ICFP : competencia anual de 3 días celebrada desde 1998 por la Conferencia Internacional sobre Programación Funcional
- Partidos de maratón de Topcoder
- Los desafíos largos de Codechef, que se llevan a cabo todos los meses, duran hasta 10 días
Inteligencia artificial y aprendizaje automático
- Kaggle : competiciones de aprendizaje automático.
- CodeCup: competencia de IA de juegos de mesa que se celebra anualmente desde 2003. Las reglas del juego se publican en septiembre y el torneo final se lleva a cabo en enero. [12] [13] [14]
- Desafío de inteligencia artificial de Google : competencias semestrales para estudiantes que se desarrollaron entre 2009 y 2011
- Halite [15] : un desafío de programación de IA patrocinado por Two Sigma, Cornell Tech, [16] y Google [17]
- Concurso abierto de programación de inteligencia artificial de la Copa AI de Rusia
Concursos centrados en tecnologías de código abierto
- La lista puede estar incompleta
Nombre del concurso | Patrocinador principal | Descripción | Ejecutando desde | Hora habitual | Siguiente ciclo de aplicación | Estado |
---|---|---|---|---|---|---|
Concurso de programación de agentes múltiples | Universidad Tecnológica de Clausthal junto con talleres orientados a agentes | Concurso internacional anual de programación para estimular la investigación en el área de programación y desarrollo de sistemas multiagente . | 2005 | Septiembre | Septiembre de 2011 | Activo |
Verano de código de Google | Corporación Google. | Un programa anual en el que Google otorga estipendios a cientos de estudiantes que completan con éxito un proyecto de codificación de código abierto / software gratuito solicitado durante el verano. | 2005 | Mar-ago | 23 de marzo - 3 de abril | Activo |
Concurso de participación altamente abierta de Google | Corporación Google. | Un concurso organizado por Google en 2007-8 dirigido a estudiantes de secundaria. El concurso está diseñado para alentar a los estudiantes de secundaria a participar en proyectos de código abierto. | 2007 | Nov-feb | Desconocido | Desconocido |
Recursos de capacitación y concursos en línea
La comunidad de programación de todo el mundo ha creado y mantenido varios recursos de Internet dedicados a la programación competitiva. Ofrecen concursos independientes con o sin premios menores. Además, los archivos de problemas pasados son un recurso popular para la formación en programación competitiva. Éstas incluyen:
Nombre | Descripción | Sitio web |
---|---|---|
CodeChef [18] [10] | Mantenido por Unacademy , organiza un concurso de 10 días de duración y un par de concursos cortos cada mes (uno con estilo IOI llamado Lunchtime y otro con estilo ICPC llamado Cook-Off), y proporciona una plataforma de alojamiento de concursos a instituciones educativas de forma gratuita. Los dos primeros ganadores del concurso largo ganan premios en efectivo, mientras que los diez primeros del mundo obtienen una camiseta. | www .codechef .com |
CodeCup | Concurso internacional anual de programación de juegos de mesa de IA organizado por la Olimpiada holandesa de informática desde 2003. [13] [14] | códecup .nl |
Codeforces [19] [18] | Recurso ruso, mantenido por la Universidad ITMO , que ofrece principalmente concursos cortos frecuentes (hasta dos por semana). Características especiales: todas las soluciones son de código abierto , capacidad para verificar la exactitud de las soluciones de otros concursantes durante la "fase de piratería", concursos virtuales, entrenamientos, etc. | codeforces .com |
CodinGame | Rompecabezas (dificultad creciente), código de golf . Organiza competiciones online periódicas ( desafíos de IA , problemas de optimización ). | www .codingame .com |
HackerEarth [18] | Empresa con sede en Bangalore , India , que ofrece un entorno similar a un concurso en línea con el objetivo de proporcionar soluciones de evaluación de la contratación. | www .hackerearth .com |
HackerRank | HackerRank ofrece problemas de programación en diferentes dominios de la informática. También alberga Codesprints anuales que ayudan a conectar a los codificadores y las nuevas empresas de Silicon Valley. | hackerrank .com |
Proyecto Euler [10] | Gran colección de problemas matemáticos computacionales (es decir, no relacionados directamente con la programación, pero a menudo requieren habilidades de programación para resolverlos). | projecteuler .net |
Topcoder [19] [18] | Recurso y empresa estadounidense, que organiza concursos y también ofrece problemas industriales como una especie de trabajo autónomo; ofrece docenas de concursos cortos y varios largos ("maratones") cada año. Característica específica: los participantes tienen la oportunidad de verificar la exactitud de las soluciones de otros concursantes después de la fase de codificación y antes de la prueba automática final (la llamada "fase de desafío"). | www .topcoder .com |
Juez en línea de UVa [19] [18] | Contiene más de 4.500 problemas para practicar. Organiza competiciones online periódicas. Inaugurado en 1995, es uno de los sitios web más antiguos. | onlinejudge .org |
SPOJ [18] | Sistema polaco de jueces en línea que presenta muchos problemas para la capacitación y proporciona una plataforma para que otros organizadores realicen sus concursos de programación. | www .spoj .com |
Abrir Kattis | Versión pública del sistema de gestión de concursos de Kattis, con un archivo de más de 2600 problemas. [19] Kattis se desarrolló para ayudar a los cursos de informática, pero también se utiliza para albergar competiciones prestigiosas, como las Finales Mundiales de ICPC. [20] | abrir .kattis .com |
AtCoder | Con sede en Japón, AtCoder ofrece concursos de programación en línea semanalmente. Los concursos se ofrecen en japonés e inglés. A partir de 2020, es una de las plataformas más populares de su tipo. [21] | atcoder .jp |
Juez en línea del Caribe | Recurso en español, mantenido por la Universidad de Ciencias de la Información . [22] Contiene más de 3000 problemas para practicar. También alberga competiciones regulares en línea. | coj .uci .cu |
Beneficios y críticas
La participación en concursos de programación puede aumentar el entusiasmo de los estudiantes por los estudios de ciencias de la computación . Las habilidades adquiridas en concursos de programación tipo ICPC también mejoran las perspectivas de carrera, ya que ayudan a aprobar las "entrevistas técnicas", que a menudo requieren que los candidatos resuelvan problemas complejos de programación y algorítmicos en el acto. [19] También en las entrevistas de software, esta es la primera tarea que los solicitantes deben despejar para pasar al siguiente nivel. [ cita requerida ]
También ha habido críticas a la programación competitiva, particularmente por parte de desarrolladores de software profesionales. [23] Un punto crítico es que muchos concursos de programación de ritmo rápido enseñan a los competidores malos hábitos de programación y estilo de código (como el uso innecesario de macros , falta de abstracción y comentarios de OOP, uso de nombres cortos de variables, etc.). [24] [23] Además, al ofrecer solo pequeños acertijos algorítmicos con soluciones relativamente cortas, los concursos de programación como ICPC e IOI no necesariamente enseñan buenas habilidades y prácticas de ingeniería de software, ya que los proyectos de software reales suelen tener muchos miles de líneas de código y son desarrollados por grandes equipos durante largos períodos de tiempo. [23] Peter Norvig afirmó que, según los datos disponibles, ser un ganador de concursos de programación se correlaciona negativamente con el desempeño de un programador en su trabajo en Google (aunque los ganadores del concurso tienen mayores posibilidades de ser contratados). [25] Norvig declaró más tarde que esta correlación se observó en un pequeño conjunto de datos, pero que no se pudo confirmar después de examinar un conjunto de datos más grande [26] [ fuente no confiable? ]
Otro sentimiento más es que en lugar de "perder" su tiempo compitiendo excesivamente resolviendo problemas con soluciones conocidas, los programadores de alto perfil deberían invertir su tiempo en resolver problemas del mundo real. [23]
Literatura
- Halim, S., Halim, F. (2013). Programación competitiva 3: El nuevo límite inferior de los concursos de programación . Lulu.
- Laaksonen, A. (2017). Guía de Programación Competitiva (Temas de Pregrado en Informática). Cham: Springer International Publishing.
Ver también
- Concursos de informática
- Código de golf
- Hackathon
Referencias
- ^ "Google Code Jam" . google.com . Consultado el 20 de febrero de 2016 .
- ^ "Patrocinador de TCO12: Google - TCO 12" . topcoder.com . Archivado desde el original el 16 de febrero de 2012.
- ^ "Copa Hacker de Facebook" . Facebook . Consultado el 20 de febrero de 2016 .
- ^ Khera, Vivek; Astrachan, Owen; Kotz, David (1993). "El concurso de programación en Internet" (PDF) . Boletín ACM SIGCSE . 25 (1): 48–52. doi : 10.1145 / 169073.169105 . ISSN 0097-8418 .
- ^ Programación de desafíos (Skiena y Revilla)ISBN 0387001638 , ISBN 978-0387001630
- ^ "Concursos mensuales de CodeChef" .
- ^ "Programadores de todo el mundo compiten en CodeChef SnackDown - ExchangeMedia" .
- ^ "Concursos de Codeforces" . Consultado el 12 de octubre de 2018 .
- ^ "Problemas de programación y concursos :: HackerRank" . HackerRank . Consultado el 20 de febrero de 2016 .
- ^ a b c Combéfis, Sébastien; Wautelet, Jérémy (2014). "Capacitaciones en Programación y Enseñanza de la Informática a través de Concursos en Línea" (PDF) . Olimpíadas de Informática . 8 : 21–34.
- ^ "Problemas de programación y concursos :: HackerRank" . HackerRank . Consultado el 20 de febrero de 2016 .
- ^ "CodeCup" . www.codecup.nl .
- ^ a b Lasse Hakulinen. Encuesta sobre concursos de informática: tareas en desarrollo - Olimpíadas de informática, 2011, vol. 5, 12-25.
- ^ a b Wevers, Lesley (2014). "Búsqueda de árboles de Monte-Carlo para Poly-Y" (PDF) . Universidad de Twente . Archivado desde el original (PDF) el 13 de abril de 2017 . Consultado el 16 de septiembre de 2018 .
- ^ "Desafío de programación de inteligencia artificial Halite" . www.halite.io .
- ^ "Two Sigma anuncia el lanzamiento público de Halite" . tech.cornell.edu .
- ^ "Halite ayuda a los estudiantes y desarrolladores a competir para crear una mejor IA en Google Cloud Platform" .
- ^ a b c d e f Luigi, William Di; Farina, Gabriele; Laura, Luigi; Nanni, Umberto; Temperini, Marco; Versari, Luca (2016). "oii-web: una programación interactiva en línea oii-web: un sistema interactivo de capacitación en el concurso de programación en línea" (PDF) . Olimpíadas de Informática . 10 : 207–222.
- ^ a b c d e Bloomfield, Aaron; Sotomayor, Borja. "Una guía de estrategia de concurso de programación" (PDF) . SIGCSE '16: Actas del 47º Simposio Técnico de ACM sobre Educación en Ciencias de la Computación .
- ^ Enström, E .; Kreitz, G .; Niemelä, F .; Söderman, P .; Kann, V. (2011). "Cinco años con Kattis - utilizando un sistema de evaluación automatizado en la enseñanza" (PDF) . IEEE Frontiers in Education Conference .
- ^ Mirzayanov, Mike; Pavlova, Oksana; Mavrin, Pavel; Melnikov, Roman; Plotnikov, Andrew; Parfenov, Vladimir; Stankevich, Andrew (2020). "Codeforces como plataforma educativa para el aprendizaje de la programación en digitalización" (PDF) . Olimpíadas de Informática . 14 . ISSN 1822-7732 .
- ^ "Acerca de | Juez en línea del Caribe" . coj.uci.cu . Consultado el 18 de junio de 2020 .
- ^ a b c d Smith, Duncan (2 de diciembre de 2015). "El debate de la programación competitiva" .
- ^ Halim, Steven. "CS3233 - Programación competitiva" . Escuela de Computación NUS .
- ^ "Ganar en concursos de programación es un factor negativo para ser bueno en el trabajo" . 5 de abril de 2015.
- ^ "Discusión de la HN sobre la correlación entre el desempeño laboral y la programación competitiva" . Diciembre de 2020.
enlaces externos
- Proyecto de código abierto para realizar concursos
- Contest Management System Herramienta de código abierto en Python para ejecutar y gestionar un concurso de programación en un servidor IOI 2012 y IOI 2013 .