stringtranslate.com

Programación competitiva

Dos hombres sentados en escritorios con una computadora y papeles tirados sobre ellos.
Petr Mitrichev (izquierda) y Gennady Korotkevich (derecha), dos destacados programadores competitivos durante la copa de algoritmos Yandex de 2013.

La programación competitiva o programación deportiva es un deporte mental en el que los participantes intentan programar de acuerdo con las especificaciones proporcionadas. Los concursos suelen realizarse a través de Internet o de una red local . La programación competitiva es reconocida y respaldada por varias empresas multinacionales de software e Internet , como Google [1] [2] y Meta . [3]

Una competencia de programación generalmente implica que el anfitrión presente un conjunto de problemas lógicos o matemáticos , también conocidos como acertijos o desafíos, a los concursantes (que pueden variar en número desde decenas o incluso cientos hasta varios miles). Los concursantes deben escribir programas informáticos capaces de resolver estos problemas. La evaluación se basa principalmente en la cantidad de problemas resueltos y el tiempo dedicado a escribir soluciones exitosas, pero también puede incluir otros factores (calidad del resultado producido, tiempo de ejecución, uso de memoria, tamaño del programa, etc.).

Historia

Uno de los concursos más antiguos conocidos es el Concurso Internacional Universitario de Programación (ICPC), que se originó en la década de 1970 [4] 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 organizaron uno de los primeros concursos de programación distribuidos en Internet inspirados en el ICPC. [5]

El interés por la programación competitiva ha crecido enormemente desde 2000 hasta alcanzar decenas de miles de participantes (ver Concursos destacados) y está fuertemente relacionado con el crecimiento de Internet, que facilita la celebració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 problemas determinados. 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 algorítmica de juegos , geometría computacional , análisis de cuerdas , matemáticas discretas y estructuras de datos . [6] Los problemas relacionados con la programación de restricciones y la inteligencia artificial también son populares en determinadas competiciones.

Independientemente de la categoría del problema, el proceso de resolución de un problema se puede dividir en dos grandes pasos: 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 que se prueban con más frecuencia en las competiciones de programación.

En la mayoría de los concursos, la evaluación la realizan automáticamente máquinas anfitrionas, comúnmente conocidas como jueces. Cada solución presentada por un concursante se compara con el juez frente a 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" sólo si produce resultados satisfactorios en todos los casos de prueba realizados por el juez y, en caso contrario, se rechaza. Sin embargo, algunos problemas de concurso pueden permitir una puntuación parcial, dependiendo del número de casos de prueba aprobados, la calidad de los resultados o algún otro criterio específico. Algunos otros concursos solo requieren que el concursante envíe el resultado correspondiente a los datos de entrada dados, en cuyo caso el juez solo tiene que analizar los datos de salida enviados.

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 menor tiempo de ejecución para un problema en particular. [7]

Competiciones notables

Competiciones de algoritmos

En la mayoría de las competiciones mencionadas anteriormente, las competiciones suelen organizarse en varias rondas. Suelen comenzar con rondas online, que concluyen en la ronda final presencial. Los mejores en IOI y ICPC reciben medallas de oro, plata y bronce. En los demás concursos, se otorgan premios en efectivo a los primeros clasificados. Los concursos también atraen el interés de reclutadores de múltiples empresas de software e Internet, que a menudo llegan a los competidores con posibles ofertas de trabajo.

Inteligencia artificial y aprendizaje automático

Concursos centrados en tecnologías de código abierto.

Plataformas 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. Hay varias organizaciones que organizan concursos de programación de forma regular. Éstas incluyen:

Beneficios y críticas

La participación en concursos de programación puede aumentar el entusiasmo de los estudiantes por los estudios de informática . Las habilidades adquiridas en concursos de programación similares al ICPC también mejoran las perspectivas profesionales, ya que ayudan a superar las "entrevistas técnicas", que a menudo requieren que los candidatos resuelvan complejos problemas algorítmicos y de programación en el acto. [19] [20]

También ha habido críticas a la programación competitiva, particularmente por parte de desarrolladores de software profesionales . [21] 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 programación orientada a objetos , uso de nombres cortos de variables, etc.). [22] [21] Además, al ofrecer sólo 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 desarrollado por grandes equipos durante largos períodos de tiempo. [21] Peter Norvig afirmó que, según los datos disponibles, ser ganador de concursos de programación se correlacionaba negativamente con el desempeño de un programador en su trabajo en Google (aunque los ganadores del concurso tenían mayores posibilidades de ser contratados). [23] Norvig declaró más tarde que esta correlación se observó en un pequeño conjunto de datos, pero que no pudo confirmarse después de examinar un conjunto de datos más grande. [24] [ ¿ fuente poco 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. [21]

Literatura

Ver también

Referencias

  1. ^ "Google Code Jam". google.com . Archivado desde el original el 31 de mayo de 2023 . Consultado el 20 de febrero de 2016 .
  2. ^ "Patrocinador de TCO12: Google - TCO 12". topcoder.com . Archivado desde el original el 16 de febrero de 2012.
  3. ^ "Copa Hacker de Facebook". Facebook . Consultado el 20 de febrero de 2016 .
  4. ^ Li, Yujia; Choi, David; Chung, Junyoung; Kushman, Nate; Schrittwieser, Julián; Leblond, Rémi; Eccles, Tom; Keeling, James; Gimeno, Félix; Lago, Agustín Dal; Hubert, Thomas; Choy, Pedro; d'Autume, Cyprien de Masson; Babuschkin, Igor; Chen, Xinyun (9 de diciembre de 2022). "Generación de código a nivel de competencia con AlphaCode". Ciencia . 378 (6624): 1092–1097. arXiv : 2203.07814 . doi : 10.1126/science.abq1158. ISSN  0036-8075.
  5. ^ Khera, Vivek; Astracán, 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. Archivado desde el original (PDF) el 8 de agosto de 2017 . Consultado el 10 de marzo de 2020 .
  6. ^ Paquete, Igor. "Algoritmos". Matemáticas 182 . Universidad de California, Los Angeles . Consultado el 31 de marzo de 2024 .
  7. ^ Desafíos de programación (Skiena y Revilla) ISBN 0387001638 , ISBN 978-0387001630  
  8. ^ Kostka, Bartosz (2021). Programación deportiva en la práctica (PDF) . Universidad de Breslavia.
  9. ^ "Celebre los concursos de codificación de Google con una ronda final de programación divertida". Blog de desarrolladores de Google . Google . Consultado el 28 de febrero de 2023 .
  10. ^ "Code Jam: concursos de codificación de Google". Concursos de codificación . Archivado desde el original el 27 de junio de 2023 . Consultado el 26 de febrero de 2023 .
  11. ^ "CIPC". icpc.global . Consultado el 26 de febrero de 2023 .
  12. ^ "Entorno de programación: documentos ICPC" . Consultado el 15 de febrero de 2024 .
  13. ^ "CIPC". icpc.global . Consultado el 26 de febrero de 2023 .
  14. ^ "Olimpíadas". stats.ioinformatics.org . Consultado el 26 de febrero de 2023 .
  15. ^ "Meta Hacker Cup - 2022 - Ronda de clasificación". www.facebook.com . Consultado el 26 de febrero de 2023 .
  16. ^ "Preguntas frecuentes: Ayuntamiento comunitario de Topcoder con Doug Hanson, director ejecutivo de Topcoder". Codificador superior . Consultado el 28 de febrero de 2023 .
  17. ^ abcdef Luigi, William Di; Farina, Gabriele; Laura, Luis; Nanni, Umberto; Temperini, Marco; Versari, Luca (2016). "oii-web: un sistema interactivo de capacitación en concursos de programación en línea" (PDF) . Olimpíadas de Informática . 10 : 207–222. doi :10.15388/ioi.2016.13. S2CID  6877554.
  18. ^ ab 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 Online» (PDF) . Olimpíadas de Informática . 8 : 21–34.
  19. ^ abcd Bloomfield, Aaron; Sotomayor, Borja. "Guía de estrategia para concursos de programación" (PDF) . SIGCSE '16: Actas del 47º Simposio técnico de ACM sobre educación en ciencias de la computación .
  20. ^ Jackson, Dean (1 de diciembre de 2013). "La entrevista técnica de Google. Cómo conseguir el trabajo de sus sueños" (PDF) . XRDS: Crossroads, la revista ACM para estudiantes . 20 (2): 12-14. doi :10.1145/2539270. S2CID  27549057.
  21. ^ abcd Smith, Duncan (2 de diciembre de 2015). "El debate sobre la programación competitiva".
  22. ^ Halim, Steven. "CS3233 - Programación competitiva". Escuela de Computación NUS .
  23. ^ "Ganar concursos de programación es un factor negativo para ser bueno en el trabajo". YouTube . 5 de abril de 2015.
  24. ^ "Discusión de HN sobre la correlación entre el desempeño laboral y la programación competitiva". Diciembre de 2020.