ACM - ICPC


El concurso de programación ACM (Association for Computing Machinery) ICPC (International Collegiate Programming Contest) es una competencia anual que se lleva a cabo desde el año 1970. Se inició en la Universidad de Texas A&M con el afán de promover la cultura competitiva entre los participantes. El organizador de ese entonces fue el Capítulo Alfa de la Sociedad de Honor en Ciencias de la Computación UPE”, el evento creció rápidamente en popularidad alrededor de Estados Unidos y Canadá.

Posteriormente IBM se convirtió en el auspiciador oficial en 1997, y desde entonces la competencia se ha incrementado en un factor de 7.5 veces. La participación se ha incrementado a tal nivel que participan más de diez mil de los mejores estudiantes en diferentes áreas de las ciencias de la computación de 1.756 universidades de 82 países de los 6 continentes.
La competencia exige habilidades creativas, trabajo en equipo y la innovación para construir nuevos programas de software y permite a los estudiantes probar sus habilidades bajo presión.

Modalidad de la Competencia
La competencia evalúa a equipos de tres estudiantes a través de problemas complejos de programación comprendido por 8 o más problemas con un tiempo máximo de 5 horas y equipados con solo una computadora, los competidores trabajan contra reloj en una competencia lógica, estratégica y de capacidad mental.
Los compañeros de equipo se colaboran entre para determinar la dificultad del problema, deducir los requerimientos, diseñar casos de prueba y construir el software que resuelve el problema bajo un intenso control de los jueces.
La prueba es controlada por jueces presénciales y virtuales. Los estudiantes solo acceden al enunciado del problema y un ejemplo de datos de prueba. Cada solución incorrecta es sancionada con un tiempo de penalidad. El equipo que resuelve más problemas en el menor tiempo acumulado es declarado ganador.


Mi Experiencia en la Competencia
El año 2010 participe en la ronda clasificatoria de mi país, donde mi equipo termino entre las primeros 10 puestos (de 117 equipos), lo que nos dio la oportunidad de participar en la clasificatoria latinoamericana para el mundial que se realizó en Orlando Florida - USA.
La experiencia en la competencia fue de las mejores, donde pude poner a prueba mis capacidades algorítmicas y la experiencia de trabajar en equipo. Y ahora mi intención es compartir las experiencias y trucos que aprendí durante la competencia.

Consejos y Trucos
Entre las cosas que hay que ponerse a pensar cuando uno compite en el ACM ICPC, tenemos algo tan básico y que muchas de las veces podríamos pasar por alto y es el que se refiere a el trabajo en equipo. Hay que recordar que solo tenemos una computadora, 5 horas y 6 manos; y bueno si no sabemos cómo trabajar en equipo u organizarnos de manera correcta tendremos a miembros del equipo en estado ocioso, esperando a que la computadora sea desocupada por otro miembro del equipo y esto a la vez genera que el que está en la computadora se ponga nervioso y cometa algún error (hay que tener en cuenta que si el equipo envía un programa con errores al juez, este lo penalizara con 20 minutos de tiempo, lo cual puede ser la diferencia entre la vitoria o el fracaso), por lo tanto una organización adecuada es imperante.

Como otro punto, tenemos que además de organizar al equipo, debemos de clasificar a los problemas a resolver, por tipo y por dificultad, para que de esta manera podamos distribuir mejor nuestros esfuerzos. Lo más recomendable es comenzar por los ejercicios simples, para que de esta manera podamos tener al menos un par del total resueltos en los primeros 10 a 20 minutos, además como un aditamento tenemos el aspecto psicológico del hecho de que ya hemos avanzado aunque sea un poco y de esta manera evitar la frustración.
Llevar consigo un resumen de las principales ecuaciones de trigonometría, algebra, geometría analítica, aritmética y calculo. Ciertamente muchas de estas ecuaciones ya las puedes conocer e inclusive las puedes saber de memoria, pero hay que tomar en cuenta que en ese momentos estas bajo mucha presión por lo cual un bloqueo mental, llega a ser muy común y por lo tanto es mucho mejor tener a mano un pequeño recordatorio y así evitar perder tiempo.

Otro punto importante y que muchas de las veces es pasado por alto, es el dominio del lenguaje de programación, esto principalmente cuando los concursantes se ven obligados a usar un lenguaje que no es de uso habitual, este fue mi caso, ya que yo uso en un 90% de las ocasiones C# y en el concurso tuve que programar en Java que es lo más cercano a mi entorno habitual de desarrollo, pero como era de suponerse me tomo un mayor esfuerzo al momento de programar, además de no poder sacar el máximo provecho al lenguaje. La recomendación aquí seria practicar al menos con una semana de antelación, el uso de características específicas del lenguaje a usar durante la competencia, con esto no me refiero a las condicionales o ciclos, sino a características como la implementación de genéricos, estructuras de datos que ya vengan con las librerías del lenguaje o como realizar el manejo de cadenas (como nota, al menos el Bolivia los lenguajes permitidos para la competencia solo son C, C++ y Java).

Aprende a leer, esto suena tonto pero es cierto y es uno de los factores que nos llevan al fracaso, porque la mayoría de los ejercicios no te explican de una manera clara el problema, esto con la finalidad de que los participantes logren desarrollar capacidades de compresión y análisis de la problemática.

Como último consejo, sugiero llevar de manera impresa las estructuras de datos y algoritmos de ordenamiento más comunes (solo se puede meter a la competencia material impreso), esto con la misma finalidad que con lo de las ecuaciones matemáticas, hay que evitar perder tiempo con cosas triviales.

La práctica hace al maestro
Como reza el antiguo adagio, la práctica lo es todo en este tipo de competencias, desafortunadamente no siempre es posible entrenarse con mucha antelación a la competencia, ya sea por los trabajos propios que conlleva el asistir a la universidad o la vida social o el simple hecho de que los miembros del equipo no tienen horarios en común para poderse reunir; ante tal situación el fracaso parece estar más cerca que el éxito, pero como una solución al estilo parche de pirata (no es la mejor, pero al menos evita que terminemos muy mal) recomiendo lo siguiente:
  • Comienza el entrenamiento al menos una semana antes de la competencia.
  • Aprender las características y usos que se les puede dar a las estructuras de datos (aprender el concepto, no la implementación).
  • Aprender y comprender como funcionan los grafos, junto con algún algoritmo (siempre hay algún problema sobre grafos en la competencia).
  • Aprende expresiones regulares y manejo de cadenas (al igual que los grafos, siempre hay uno de este tipo de problemas).
  • Desempolva tu libro de Geometría analítica y dale una repasada, ya que son comunes los ejercicios de este tipo.
  • Practica con un juez online como el de la Universidad de Valladolid, para entrar en calor.
Preguntas rápidas
¿Un equipo puede estar compuesto por más de 3 miembros?
El equipo puede estar compuesto de hasta 4 miembros, pero solo 3 pueden entrar a competir, el cuarto miembro es de refuerzo en caso de que alguno de los miembros no pueda participar.

¿Por qué los globos en las fotos?
Los globos muestran cuanto ejercicios han sido resueltos por el equipo y además basado en los colores, que ejercicios han resuelto.

¿El concurso es para todos?
Ciertamente todo estudiante universitario puede ser parte del concurso, pero hay que tomar en cuenta el hecho de que los miembros del equipo deben de poseer una alta capacidad en algoritmia, lógica y sobre todo actitud para resolver problemas. 

¿Se puede usar otro lenguaje de programación aparte de C, C++ o Java?
En algunos paises si es posible utilizar otros lenguajes como C#, Pascal, etc. pero esto depende del organizador regional. Ademas hay que tomar en cuenta que en la fase final del concurso (Final Mundial) solo estan permitidos C, C++ y Java.

¿Qué entorno de desarrollo se utiliza?
El entorno de desarrollo es Eclipse + CDT tanto para C/C++ como para Java. Al igual que los lenguajes de programación, en algunos países esta permitido el uso de otros entornos de desarrollo.

¿Los problemas en que idioma viene?
Los problemas vienen por lo general en ingles, aunque en algunos sitios como Bolivia o Brasil vienen en el idioma oficial del país.

Links Útiles
Sitio Oficial de la Competencia: http://icpc.baylor.edu/welcome.icpc
Sitio Oficial de la Competencia en Bolivia: http://www.icpc-bolivia.edu.bo/
Juez Online de la Universidad de Valladolid: http://uva.onlinejudge.org/
Set de problemas de las finales del mundo: http://icpc.baylor.edu/info/Problem+Resources
Set de problemas pasados para Latinoamérica (Argentina, Bolivia, Brasil, Chile, Colombia, Cuba, Perú, México y Venezuela): http://www.icpc-bolivia.edu.bo/examenes_pasados.html
Lista de Libros Útiles para el Entrenamientos: http://www.icpc-bolivia.edu.bo/libros.html

Comentarios

Entradas populares de este blog

Ejecutar comandos en el CMD de Windows desde C#

Crear una aplicacion Android en Netbeans

Modern UI Style para WPF