domingo, 31 de octubre de 2010

Vine, Vi, Vencí

En mi opinión, los maratones de programación son experiencias enriquecedoras e incluso divertidas. Sin embargo, cuando empezamos a competir, nos damos cuenta de que la gran mayoría de los problemas propuestos en la competencia necesitan de teoría y herramientas que aún no conocemos o manejamos completamente. Cuando esto pasa, es natural que nos desmotivemos un poco y sintamos que no estamos a la altura de la competencia. Sin embargo, realmente no es momento de desanimarse. Hasta los mejores competidores del mundo alguna vez supieron tanto y hasta menos que nosotros. ¿Y como llegaron a ser los mejores? Con mucha práctica, mucha ayuda pero sobre todo, con continua pasión, dedicación y perseverancia.

Ahora, las primeras preguntas que uno podría hacerse son: ¿Cómo puedo aprender? ¿Qué cosas debo practicar? ¿Quién me puede enseñar? Como en toda competencia orientada al ejercicio intelectual, la participación en los maratones de programación necesitan de un balance entre la teoría y la práctica, así como de la comprensión de la estrecha conexión que ambas partes comparten. La práctica nos dará formas de expresarnos (lenguajes, librerías y hasta patrones eficientes de diseño) y nos dará velocidad a la hora de pensar, comprender, plantear, codificar y finalmente resolver los problemas que nos propongamos. La teoría nos dará visión, nuevas formas de atacar los problemas, maneras eficientes de lograr los resultados, capacidad para reconocer problemas similares y plantear su solución en base a problemas o estrategias que ya conozcamos.

Lo que quisiera mencionarles ahora es algunos sitios en la Web donde pueden adquirir conocimientos y luego ponerlos en práctica resolviendo problemas interesantes. Empiezo con algunos sitios donde es posible ejercitar la parte teórica:



  • Los tutoriales de Topcoder: Esta pequeña colección de tutoriales sobre algoritmia son de gran ayuda, tanto para principiantes como para competidores intermedios y avanzados. Plantean de una forma amena, muchas de las estrategias de programación que un competidor debe conocer, así como código que implementa dichas estrategias y ejemplos concretos con problemas en donde las mismas deban aplicarse para lograr resolverlos. Muchos de estos tutoriales incluyen también una lista de problemas relacionados en los que se puede poner en práctica lo aprendido, separados por nivel de dificultad. En lo personal, me fueron de gran ayuda los tutoriales de Geometría y de Maximum Flow (una clase de problemas sobre grafos).


  • Wolfram Mathworld: Este sitio está dedicado enteramente a las matemáticas. No provee de tutoriales concretos sobre los maratones de programación, pero si plantea soluciones a problemas matemáticos que pueden encontrarse escondidos en el enunciado de problemas de programación. Para entrenarse en un área particular que está presente en los maratones, conocida como "Teoría de Números", esta es posiblemente la página más adecuada y completa. Además, como parte del proyecto del creador de esta página, se encuentra el motor de conocimiento Wolfram Alpha, el cual permite resolver ecuaciones y dar respuesta a toda clase de preguntas (no solo matemáticas). Es interesante pasarse por ese sitio solo para observar el inmenso potencial que posee para resolver toda clase de dudas.



Existen también muchos libros de texto que pueden ayudar a comprender algunos conceptos teóricos relacionados a los maratones de programación, como el "Introduction to Algorithms" de Thomas Cormen, o el "Fundamentals of Algorithmics" de Gilles Brassard. Sin embargo, por su naturaleza puramente teórica, a veces pueden ser un poco tediosos de leer y dificiles para encontrar su relación con problemas de programación concretos. Otro libro ampliamente utilizado, que es interesante leer, es el "Art Of Programming Contest" de Miguel Revilla y Steven Skiena. Éste plantea una buena relación entre teoría y práctica, con secciones teorícas, ejercicios de ejemplo y otros más de tarea incorporados. La soluciones a los problemas en este libro pueden ser enviadas al sitio "Programming Challenges", para ser juzgadas como correctas o incorrectas.

Ahora, por la parte práctica, existen muchísimos jueces online que permiten que uno resuelva un problema, se los envíe y se juzgue automáticamente de forma que sepamos si nuestra solución era correcta o no. A continuación les menciono algunos de los que más he usado:



  • SPOJ (SPhere Online Judge): Por mucho el juez online en el que más he practicado. La interfaz y la navegabilidad del sitio hacen sencillo mandar problemas y esperar el veredicto del juez virtual. Otorga la posibilidad de resolver los problemas en una amplia variedad de lenguajes, con una gran base de problemas disponibles para escoger. La puntuación de cada problema depende de la cantidad de personas que lo ha resuelto, por lo que los problemas difíciles posiblemente valdrán más que los problemas fáciles. Ahora, si lo queremos para practicar para los maratones ACM-ICPC, debemos concentrarnos en practicar exclusivamente en C/C++ o Java. Una gran desventaja de SPOJ es que a veces los tiempos límites para los problemas suelen estar muy apretados, ocasionando que la misma solución sea incorrecta (demasiado lenta) en Java y aceptada en C/C++. Esto lo hace injusto con aquellas personas que quieran practicar en Java, afortunadamente es una dificultad que solo ocurre con algunos de los problemas.


  • TopCoder: Más que un juez virtual, es un portal completo dedicado al desarrollo de aplicaciones y la comunicación entre programadores del mundo. Tiene muchos tipos de competencia distintas, en donde los mejores programadores de distintas áreas de la programación, el diseño gráfico y la ingeniería de software pueden competir entre sí y medirse ante el resto del mundo (posiblemente incluyendo premios monetarios). La competencia más relacionada a los maratones de programación es la que ellos llaman "Algorithm Competition" (Los "Marathon Match" son otro tipo de competencias, interesantes, pero completamente distintas). Lo mejor de este portal es que toda la codificación puede hacerse desde un applet que ellos llaman "Arena" que incluye los compiladores para los lenguajes que ellos soportan y facilidades para probar el código de forma sencilla. El formato de los problemas es bastante distinto ya que no se debe leer ni escribir nada, ni a un archivo, ni a la entrada/salida estándar. Más bien lo que se pide es que se implemente únicamente una función que, dado ciertos argumentos, devuelva la solución al problema planteado. TopCoder organiza competencias aproximadamente cada dos semanas, sin embargo todas las competencias pasadas pueden ser vistas y resueltas en los salones de práctica.


  • UVA (Universidad de VAlladolid): Es un juez virtual, parecido a SPOJ. Sin embargo es en realidad uno de los primeros y con mayor cantidad de problemas disponibles. Muchos de los mejores competidores del mundo han practicado con este juez virtual que incluye problemas de todas las categorías. Su más grande desventaja sin embargo es la navegabilidad, lo que la hace muy difícil de usar. Además de esto, lenguajes como Java cuentan con compiladores que no están lo suficientemente actualizados (situación que han enmendado mucho últimamente). Una ventaja, por otra parte, es que los tiempos límites están mucho mejor planteados que en SPOJ, resultando en un juicio justo sin importar el lenguaje escogido.



Existen muchos otros jueces online como USACO, Codeforces, etc. Sin embargo, no he tenido el suficiente contacto con ellos como para mencionarles de que se trata cada uno. Queda de su parte investigarlos y aprovecharlos de ser de su agrado.

Ya entonces solo queda practicar y aprender bastante, dedicarse a ser cada vez mejor, participar de la mejor forma en las competencias, pero sobre todo disfrutar cada momento. ¡Muchas gracias por leer! Cualquier comentario o sugerencia es más que bienvenido. En un futuro post hablaré de las competencias en las que se puede participar, más allá de los ACM-ICPC. Hasta una próxima vez.

4 comentarios:

  1. Excelentes recursos !! Gracias, veo que te esfuerzas. Saludos y sigue así !!

    ResponderEliminar
  2. Lo que más me llamó la atención de esta entrada fue la forma elegante en la que los recursos gráficos fueron utilizados. Sirven para descansar un poco la lectura (especialmente en monitores de alta resolución) y le da cierto color al mismo dado el "theme" que tiene el blog actualmente.

    Por otra parte, está genial la información sobre los recursos y que se tomó el tiempo para profundizar un poco sobre aquellos en los que tienes experiencia.

    Esta entrada, con otra sobre "cómo ser bueno en maratones de programación y no morir en el intento" que se enfoque en motivar a la gente y ya hay tarea y "comida" para rato.

    ResponderEliminar
  3. Más importante que elegir un juez tipo SPOJ o UVa para resolver problemas eventualmente, es participar en los SRMs y los Codeforces que se hacen periódicamente, se aprende más compitiendo que simplemente resolviendo problemas.

    ResponderEliminar
  4. ¡Muchas gracias por sus comentarios! :D

    Jorge, yo creo que ambas cosas son importantes. Los SRM desarrollan velocidad, pero de poco sirven si no se han resuelto problemas parecidos antes. Un principiante que participe en Topcoder posiblemente se espante de las competencias por la naturaleza violenta y quizá algo estresante de las mismas, jeje. Para reforzar conocimientos recien aprendidos, creo que resolver problemas con calma en un juez virtual, como SPOJ o UVA, es realmente lo ideal.

    Claro, uno puede alegar que después de un SRM están los salones de práctica para terminar los problemas que no se hayan logrado resolver. Pero esto ahora es completamente equivalente a haber practicar con un juez online en primer lugar, jeje. :P

    ResponderEliminar