[0] Empezando en programación competitiva
Si te gusta la programación, resolver problemas lógicos y/o matemáticos, encarar desafíos y participar en competencias, todo esto mientras te diviertes y aprendes, pues déjame decirte que este articulo te puede interesar.
¿Qué es la programación competitiva?
Actualmente la programación competitiva es considerado un deporte en el cual se resuelven problemas usando conceptos lógicos y matemáticos mediante el desarrollo de código en un lenguaje de programación y en un tiempo límite.
La programación competitiva se desarrolla mediante concursos o competencias, y dependiendo del tipo de competencia puede ser por equipos o individuales y pueden durar entre 1 hora o algunos días. En general en cada competencia se les presenta a los competidores una cantidad finita de problemas (pueden ser entre 3 a 15 problemas dependiendo de la competición), todos estos problemas ya fueron resueltos y probados por los autores. Cada problema tiene una definición y/o explicación del problema, con sus respectivos datos de entrada, salida, restricciones (como la cantidad y limites de los datos) y casos en prueba (se les da solo una pequeña porción a los competidores, los otros casos son para el juez).
Los competidores deben presentar una solución (código en algún lenguaje de programación) a cada problema, esta solución será revisado por un juez, normalmente es un juez programado que ejecuta la solución y de forma automática revisará las salidas con todo el conjunto de casos de prueba que el autor dispuso. Para que una solución sea aceptada debe pasar todos los casos de prueba y cumplir con la limitación de tiempo y memoria que problema proporciona.
Existe también algunas competiciones donde las soluciones solo deben coincidir con las salidas de los casos de prueba, en otras palabras la solución son las respuestas de todos los casos de prueba, no se necesita enviar el código, y debe cumplir el formato indicado en la salida del problema.
Habilidades que puedo adquirir
La programación competitiva te puede traer muchas ventajas en tu desarrollo profesional, puedes convertirlo en un hobby y más aun si lo compartes con otras personas formando equipos de entrenamiento. Los beneficios que puedes obtener son:
Mejora las habilidades mentales y lógicas, en tu entrenamiento aprenderás conceptos de algoritmos y estructuras de datos que son muy útiles e indispensables para la resolución de problemas y el desarrollo de software.
Te prepara para las entrevistas, estarás un paso por delante para entrevistas de trabajo en empresas como Google, Facebook, Amazon entre otros.
Mejora el trabajo en equipo, si participas de competencias en equipo como la ICPC y IOI.
Puedes ser contratado, al participar en las competencias mundiales y por ser muy difíciles y prestigiosas, las empresas están muy interesadas en los concursantes.
Pero no todo son beneficios, a diferencia del desarrollo de software, en la programación competitiva se necesita resolver problemas lo mas rápido posible, por ende no se enfoca en buenas practicas de programación como el código limpio y legible. La programación competitiva puede ser divertida y frustrante para las personas que lo practican, muchas veces te toparas con problemas que parecen imposibles de resolver o peor aun son fáciles de entender pero no de implementar, porque necesitas conocimientos un poco mas avanzados sobre temas de estructuras de datos y algoritmos que no están a tu alcance en esos momentos. Pero no te desalientes todo esfuerzo tiene su recompensa.
Lo indispensable para comenzar
Entre las habilidades y conocimientos mínimos para comenzar están:
Conocer algún lenguaje de programación (los más usados en programación competitiva son C++, Java y Python), tener claro los conceptos de declaración de variables, bucles, condicionales y operaciones lógicas, además de saber compilar (en algunos casos) y ejecutar un simple archivo de código del lenguaje de programación que se use.
Conceptos básicos de matemática y lógica (suma, resta, multiplicación, división, modulo, ecuaciones, operaciones lógicas).
Listo, con estos puntos uno puede empezar a resolver problemas básicos o participar de una competencia, con el tiempo iras aprendiendo conceptos de algoritmos y estructuras de datos que serán herramientas para entender temas más complejos y que te ayudaran en la resolución de problemas. Algunos recursos para empezar a practicar:
Un editor de texto, el de tu preferencia, hasta un bloc de notas sirve para empezar a escribir el código.
Jueces en linea para practicar (Codeforces, CodeChef, Leetcode, SPOJ).
Competencias y Jueces
Las competencias se pueden realizar de manera presencial o en linea, también hay jueces en linea para realizar simulaciones de competencias y practicas, entre los mas conocidos tenemos:
The ICPC International Collegiate Programming Contest, en una competencia anual de equipos de 3 personas entre universidades de todo el mundo.
International Olympiad in Informatics, es una competencia de equipos de 4 personas para estudiantes de secundaria de todo el mundo, tu país debe ser miembro de la IOI para participar.
TCS CodeVita, es una competencia individual para estudiantes de universidad abierta a todo el mundo.
Facebook Hacker Cup, es una competencia anual e individual para participantes de todo el mundo.
Google Code Jam, es una competencia anual e individual para participantes de todo el mundo.
Codeforces, juez en linea, realiza competencias semanales y tiene una comunidad muy activa que proveen tutoriales.
CodeChef, juez en linea, realiza competencias semanales de corta y larga duración.
Topcoder, juez en linea, realiza competencias mensuales, anuales como el TCO y maratones.
LeetCode, juez en linea enfocado en problemas para entrevistas de trabajo, realiza competencias semanales.
AtCoder, juez en linea, realiza competencias semanales.
HackerEarth, juez en linea, realiza competencias mensuales de corta y larga duración, tiene también problemas de entrevistas y tutoriales.
Sphere Online Judge (SPOJ), juez en linea muy usado por la calidad de problemas que presenta.
Kattis, juez en linea, tiene un banco de concursos que se han realizado en todo el mundo.
Espero haber incentivado tu curiosidad por este tema que puede ser muy apasionante para los que nos gusta la programación y resolver problemas desafiantes.