Primer equipamiento: El lenguaje de programación. Entre más conocimiento se tenga de un lenguaje mejor y entre más lenguajes se conozcan mucho mejor. No recomiendo comenzar a aprender muchos lenguajes al mismo tiempo, ya que la salud mental de cualquiera se puede volver muy frágil con el exceso de información. Entonces escoja un lenguaje y comience a aprender del mismo, cuando ya se pueda desenvolver con él puede decidir entre aprender otro lenguaje o seguir aprendiendo del mismo lenguaje. Los primeros lenguajes que recomiendo aprender son C++ o Java. Nombro estos dos porque para las competencias de la ACM-ICPC generalmente se usan C/C++/Java; no menciono C porque C++ es C pero con más herramientas. También puede escoger otros lenguajes como Python, Perl, Ruby, Haskell, Prolog, Pascal, etc. Donde cada uno tiene sus ventajas y sus desventajas. A lo largo de su aprendizaje podrá ir determinando cuál lenguaje le conviene más para resolver un problema.
Para aprender C++ (mi lenguaje por default) recomiendo esta página, que a mí me ha servido de mucho:
http://www.cplusplus.com/reference/
Después de que escoja su lenguaje, comience a aprender y a practicar. Recomiendo aprender un nuevo tema y practicarlo hasta que sienta que tiene dominio sobre el mismo. Para aprender recomiendo las siguientes referencias:
- El famoso Cormen: Introduction to Algorithms. Es un excelente libro con gran variedad de temas para aprender.
- Art of Programming Contests. Otro buen libro para comenzar a aprender.
- TopCoder Tutorials. Éstos tutoriales me han parecido excelentes para aprender muchos temas que tal vez no encuentre en las lecturas mencionadas anteriormente.
- Manuscritos de Edsger W. Dijkstra. Algunos problemas puntuales resueltos por Dijkstra. Realmente no he leído muchos, pero los que leí me encantaron. Una buena práctica podría ser leer un problema, tratar de encontrar una solución y luego leer (y muy importante: entender) la solución propuesta por Dijkstra. Los artículos que leí contienen una muy buena explicación acerca de la solución del problema y una demostración formal de la solución, así que son buenos para expandir la mente.
- Algorithm problems for dummies: Petr Mitrichev's blog. El Blog de uno de los mejores programadores de todo el mundo: Petr Mitrichev. Precaución: el Blog es un tanto profundo jejeje.
- Mi Blog. Espero que algún día sirva de referencia para varios programadores alrededor del mundo. Por supuesto, tendria que empezar a traducirlo a inglés al menos =P.
- SPOJ. Mi online judge preferido =P. Me gusta mucho por la gran variedad de lenguajes, los problemas tienen diferente dificultad por lo tanto diferente valor, algo llamado "Ignore extra whitespaces" (los que sufran de varios Wrong Answer o Presentation Errors en páginas como UVa a causa de cosas como un espacio en blanco de más o la última línea no termina en '\n' sabrán que ésto es la gloria =P). Además soy problemsetter acá, así que espero que vean algunos problemas que he publicado o publicaré allá =D.
- UVa. Detesto la navegabilidad de esta página -.-', esa es una de las razones por las que he dejado de programar allí. Pero bueno aquí les dejo unos truquitos para esta página: traten de acceder a ella usando Google Chrome; cuando vayan a las últimas 50 submissions y le den click a un problema o usuario le aparecerá un mensaje diciendo algo tipo "You are not authorised to view this resource." borren el "com_" que se encuentra luego de la variable option del url y podrán acceder al recurso sin problemas =P.
- SPOJ Brasil. Otra "sucursal" de SPOJ con diferentes problemas y además en portugués.
- CodeChef. Online judge de la gente de India.
- TopCoder. Un judge un tanto diferente ya que tiene que bajar una arena en Java y resolver los problemas en el applet. Luego me tomaré la libertad de hablar de TopCoder ya que a mi parecer requiere una entrada completa =P.
- Codeforces. Judge de la gente de Rusia (creo que de la gente de Saratov).
- USACO. Un buen lugar para comenzar porque vas resolviendo problemas a medida que te encuentras con puntos teóricos.
- Facebook's puzzles. Unos problemitas de Facebook =P. El método de sumisión es un tanto diferente ya que tiene que mandar el programa por email a una dirección, con un archivo en cierto formato, etc. No me parece muy interesante, pero si algo que vale la pena mencionar.
- 2000's ACM-ICPC Live. Ésta generalmente la uso para hacer los problemas de suramericanos pasados.
- Project Euler. Un sitio con unos cuantos problemas interesantes para poner a trabajar la mente ;-).
Después de aprender un lenguaje y haber practicado un poco puede seguir practicando en maratones de programación =P. Algunos de ellos son:
- ACM-ICPC. Se dividen en maratones locales por universidad, luego en maratones regionales (como el suramericano) y luego en maratones mundiales (ACM-ICPC World Finals).
- Google Code Jam. Una competencia organizada por Google donde compiten miles de personas.
- TopCoder Open. Competencia organizada por TopCoder donde al igual que el Google Code Jam, compite muchísima gente.
- IOI. Una competencia para gente de colegios o estudiantes de los primeros años de la universidad. La verdad, no tengo muy claro como es esta competencia, pero se las dejo aquí por si quieren investigar un poco.
- Connect de Smartmatic. Son competencias realizadas por la compañía Smartmatic aquí en Venezuela. Muy buenas competencias, a lo mejor porque tienen recompensa monetaria (aunque no mal interpreten, no compito en maratones por premios en físico, aunque son un incentivo xD) o porque son onsite y puedes conocer a más gente de Venezuela metida en el mundo de los maratones. Además de que tienen promotoras muy bonitas allí xD.
Ya el próximo post comenzaré con materia de los maratones =P. Recuerden que su opinión es bienvenida acá y si quieren proponer temas de interés pues vengan.
Te felicito por tu blog, David!! ya tienes un seguidor seguro.. :) yo no soy muy bueno en las competencias de programación jeje pero sí me interesan mucho y quiero practicar más para ver si al menos algún día logro llegar a buenos lugares. Muy finas tus recomendaciones, las voy a seguir :D
ResponderEliminarEsta bien fino el blog, man! sigue así!
ResponderEliminar