stringtranslate.com

Programación competitiva

Dos hombres sentados en escritorios con una computadora y papeles esparcidos 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 según unas especificaciones dadas. Los concursos suelen celebrarse a través de Internet o de una red local . La programación competitiva está reconocida y respaldada por varias empresas multinacionales de software e Internet , como Google , [1] [2] y Meta . [3]

En una competición de programación, el anfitrión suele presentar un conjunto de problemas lógicos o matemáticos , también conocidos como acertijos o desafíos, a los concursantes (cuyo número puede variar 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 empleado en escribir soluciones exitosas, pero también puede incluir otros factores (calidad del resultado obtenido, tiempo de ejecución, uso de memoria, tamaño del programa, etc.).

Historia

Uno de los concursos más antiguos que se conocen es el Concurso Internacional de Programación Universitaria (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.

Entre 1990 y 1994, Owen Astrachan , Vivek Khera y David Kotz organizaron uno de los primeros concursos de programación distribuidos basados ​​en Internet inspirados en el ICPC. [5]

El interés en la programación competitiva ha crecido ampliamente desde el año 2000 hasta alcanzar decenas de miles de participantes (ver Competiciones destacadas), y está fuertemente vinculado al crecimiento de Internet, 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 el código fuente de programas informáticos que sean capaces de resolver problemas determinados. Una gran mayoría de los problemas que aparecen en los concursos de programación son de naturaleza matemática o lógica. Las tareas típicas de este tipo 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 , matemáticas discretas y estructuras de datos . [6] Los problemas relacionados con la programación con 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 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 ponen a prueba con más frecuencia en los concursos de programación.

En la mayoría de los concursos, la evaluación se realiza automáticamente por medio de máquinas anfitrionas, comúnmente conocidas como jueces. 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 se rechaza en caso contrario. Sin embargo, algunos problemas de concurso pueden permitir una calificación parcial, dependiendo de la cantidad de casos de prueba aprobados, la calidad de los resultados o algún otro criterio especificado. 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 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 destacadas

Competiciones de algoritmos

En la mayoría de los concursos mencionados, los concursos suelen organizarse en varias rondas. Normalmente comienzan con rondas en línea y concluyen con una ronda final presencial. Los mejores participantes en IOI e 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 los reclutadores de varias empresas de software e Internet, que a menudo contactan 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 en Internet dedicados a la programación competitiva. Ofrecen concursos independientes con o sin premios menores. Normalmente, a los usuarios se les asigna una calificación en función de su desempeño en dichos concursos. Los archivos de problemas pasados ​​son recursos populares para la formación en programación competitiva. Hay varias organizaciones que organizan concursos de programación de forma periódica, entre ellas:

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 a los del ICPC también mejoran las perspectivas profesionales, ya que ayudan a aprobar las "entrevistas técnicas", que a menudo exigen que los candidatos resuelvan problemas complejos de programación y algoritmos en el momento. [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 , la falta de abstracción y comentarios de OOP , el uso de nombres de variables cortos, etc.). [22] [21] 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 miles de líneas de código y son desarrollados por equipos grandes durante largos períodos de tiempo. [21] Peter Norvig afirmó que, según los datos disponibles, ser un 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 afirmó más tarde que esta correlación se observó en un conjunto de datos pequeño, pero que no se pudo confirmar después de examinar un conjunto de datos más grande. [24] [ ¿ fuente poco confiable? ]

Otro sentimiento 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

Véase 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. ^ "Facebook Hacker Cup". Facebook . Consultado el 20 de febrero de 2016 .
  4. ^ Li, Yujia; Choi, David; Chung, Junyoung; Kushman, Nate; Schrittwieser, Julian; Leblond, Rémi; Eccles, Tom; Keeling, James; Gimeno, Felix; Lago, Agustin Dal; Hubert, Thomas; Choy, Peter; d'Autume, Cyprien de Masson; Babuschkin, Igor; Chen, Xinyun (9 de diciembre de 2022). "Generación de código de nivel de competencia con AlphaCode". Science . 378 (6624): 1092–1097. arXiv : 2203.07814 . doi :10.1126/science.abq1158. ISSN  0036-8075.
  5. ^ 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. Archivado desde el original (PDF) el 8 de agosto de 2017. Consultado el 10 de marzo de 2020 .
  6. ^ Pak, Igor. "Algoritmos". Matemáticas 182. Universidad de California, Los Ángeles . 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 las competencias de programació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 programación de Google". Concursos de programación . Archivado desde el original el 27 de junio de 2023. Consultado el 26 de febrero de 2023 .
  11. ^ "ICPC". icpc.global . Consultado el 26 de febrero de 2023 .
  12. ^ "Entorno de programación – Documentos del ICPC" . Consultado el 15 de febrero de 2024 .
  13. ^ "ICPC". icpc.global . Consultado el 26 de febrero de 2023 .
  14. ^ "Olimpiadas". 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 - Reunión comunitaria de Topcoder con Doug Hanson, director ejecutivo de Topcoder". Topcoder . 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 de formación de concursos de programación interactiva en línea" (PDF) . Olimpiadas 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). "Formación en programación y enseñanza de informática mediante concursos en línea" (PDF) . Olimpiadas 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 la 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 tus sueños" (PDF) . XRDS: Crossroads, la revista de la 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". Facultad de Informática de la NUS .
  23. ^ "Ganar en concursos de programación es un factor negativo para ser bueno en el trabajo". YouTube . 5 de abril de 2015.
  24. ^ "Discusión en HN sobre la correlación entre el desempeño laboral y la programación competitiva". Diciembre de 2020.