Para obtener el éxito en estas competencias es muy importante atender dos grandes frentes: Razonamiento lógico-matemático y programación de computadoras. En la ODI los competidores deberán ser capaces de analizar los problemas planteados e identificar conceptos lógico-matemáticos y algorítmicos que le ayuden a resolverlos, y por último escribir las soluciones de los problemas en uno de los lenguajes permitidos: C, C++, Java o Python.
Los competidores deben conocer y entender la estructura básica y la operación de una computadora (CPU, Memoria, E/S). Se espera que sean capaces de utilizar una computadora estándar con una interfaz gráfica, su sistema operativo y el entorno de desarrollo provisto. En particular, deben de tener ciertas competencias en la gestión básica de archivos (creación de carpetas, archivos, copiado y pegado, redireccionamiento de entrada y salida).
¡Esta competencia está abierta a todos! Si eres un principiante absoluto a la programación, puedes iniciar aprendiendo a través de este enlace: http://learn.code.org/. Es un curso de programación totalmente gratuito. La opción para cambiar a español se encuentra en la última parte de esa página.
Tópicos de Competencia
El banco de tópicos de problemas de la ODI es sustancial. Para ayudarte a planificar tu estudio, lo listamos debajo:
Temario 1. Matemáticas
- Aritmética y Geometría
- Enteros, Operaciones (incl. exponenciación), comparación.
- Propiedades de los enteros (positivos, negativos, pares, impares, divisibles, primos).
- Fracciones, porcentajes.
- Puntos, vectores, coordenadas cartesianas (en 2D).
- Distancia Euclidiana, Teorema de Pitágoras.
- Segmento de línea, propiedades de la intersección.
- Ángulos.
- Triángulos, rectángulos, cuadrados, círculos.
- Estructuras Discretas
- Funciones (inyección, inversas, composición, biyección).
- Relaciones (reflexivas, simétricas, transitivas, relaciones de equivalencia, orden total/lineal, orden lexicográfico).
- Conjuntos (diagramas de Venn, complementos, productos cartesianos, conjuntos potencias).
- Tablas de verdad.
Temario 2: Ciencias de Computación
- Fundamentos de Programación
- Conocer al menos uno de estos lenguajes: C, C++, Java o Python. ¡No necesariamente es ventaja conocer más de uno!
- Variables, tipos, expresiones y asignación.
- Entrada/Salida estándar.
- Estructuras de condicionales y de iteración.
- Funciones y paso de parámetros.
- Técnicas de Resolución de Problemas y Algoritmos
- Estrategias Generales de Resolución de Problemas (entender-planificar-hacer-revisar, separación de intereses, generalización, especialización, distinción de casos, trabajando hacia atrás).
- El rol de los algoritmos en el proceso de resolución de problemas.
- Estrategias de implementación para algoritmos.
- Estrategias de depuración.
- El concepto y propiedades de los algoritmos (corrección, eficiencia).
- Estructuras de Datos Fundamentales
- Tipos primitivos (valores de verdad (verdadero o falso), enteros, decimales).
- Arreglos
- Estrategias Algorítmicas
- Estrategias de diseño de bucles simples.
- Algoritmos computacionales fundamentales
- Operaciones simples sobre enteros.
- Manipulación simple de arreglos (llenar, desplazar, rotar, invertir, mínimo y máximo, suma de prefijos).
Cursos en Línea Gratuitos
Los participantes pueden usar los siguientes cursos y recursos gratuitos en línea:
- Fundamentals of Computing Specialization Track at Coursera
- Algorithms, Part 1 (Princeton) at Coursera
- Algorithms: Design and Analysis Part 1 (Stanford) at Coursera
- CS 161 – Design and Analysis of Algorithms at Stanford OpenClassroom
- Introduction to Java Programming at Udacity
- Algorithms at Udacity
- Introduction to Computer Science at Udacity
Libros
Los siguientes libros proveen una buena introducción a las competencias de programación y a los tópicos de las ciencias de la computación involucrados en las mismas:
- Skiena, S., Revilla, M. (2008). Desafíos de Programación. NY: Lulu. ISBN 978-1409277293.
- Halim, S. (2013). Competitive Programming 3. NY: Lulu.
- Algorithm Design, by Kleinberg
- A Primer for Mathematics Competitions, by Zawaira and Hitchcock
- The Art and Craft of Problem Solving, by Zeitz
- Introduction to Algorithms, by Cormen, Leiserson, Rivest, and Stein
- Competitive Programming 3 by Steven Halim
- Más libros pueden ser consultados través de la Lista Oficial de Libros recomendados por la IOI.
Lenguajes de Programación
Unos enlaces que enseñan lenguajes de programación en específico:
- C++ Language Tutorial: (http://www.cplusplus.com/doc/tutorial/)
- Python: (http://www.mclibre.org/consultar/python/)
- Java: (https://www.codecademy.com/learn/learn-java/)
Recursos En Línea
En Code.Org (http://learn.code.org/) se encuentra un curso gratuito de introducción a la informática y a la programación. Otros sitios como Coursera (www.coursera.org) y Udacity (www.udacity.com) tienen cursos similares, los cuales no asumen ningún conocimiento de programación previo.
En TopCoder (http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index) se encuentra una rica lista de tutoriales de distintos tipos de algoritmos.
Introducción a Algorítmos (http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/)
En CodingBat (http://codingbat.com/) puedes poner a prueba tu conocimiento de Python.
Otros Concursos y Competencias
- Codeforces
- HackerRank Algorithms Track
- CodeChef
- UVa Online Judge
- ProjectEuler