Errores+comunes

=Errores Comunes en Concursos en Línea y Presenciales= traducido del original [|Common Mistakes in Online an Real-time Contest]


 * Introducción**

Cada año la [|Association for Computing Machinery (ACM)] organiza un concurso mundial de programación. Este concurso consta de dos fases: el concurso regional y la final mundial. Los equipos con los mejores resultados en la etapa regional avanzan a la final. El concurso es un escaparate de los mejores programadores del mundo para las grandes compañias que están en busca de nuevos talentos. Cuando se entrena para una competencia de programación, recuerda que todo tu esfuerzo debe esta dirigido directamente a mejorar tus habilidades de programación. El éxito en los concursos de programación está afectado por muchos factores no relaciones con la habilidad, como la adrenalina, la suerte y el conjunto de problemas en el concurso. Una forma de obtener una retroalimentación inmediata a tu esfuerzo es mejorar tu ranking continuamente mediante el juez en línea de la UVA, utilizado para prácticar.

Este artículo está dirigido a programadores incipientes en concursos de programación. Se discuitirán problemas comunes de cara a los concurso, el [|juez en línea de la Universidad de Valladolid]. Las sugerencias están divididas en 3 partes: Sugerencias para concursos en línea, para concursos presenciales y las que conciernen al juez en línea.


 * Diferentes Tipos De Concursos**

Año con año, muchos concursos de programación se llevan a cabo, tales como [|ACM regional contests], [|International Olympiad in Informatics (IOI)], [|Centrinës Europos informatikos olimpiados (CEOI)], y el [|Programmer of the Month (POTM) contest]. El concurso presencial más importante es el [|ACM International Collegiate Programming Contest (ICPC)], y el más prestigioso en línea es el [|Internet Problem Solving Contest (IPSC)].


 * ACM International Collegiate Programming Constest (ICPC)**

Se lleva a cabo en 5 horas y generalmente contiene 8 problemas. (Aunque, la Final Mundial de 2001 constó de 9 problemas). Tres personas por equipo son asignadas a una solo computadora. Los equipos envían sus soluciones al juez automatizado mediante el software llamado PC2, desarrollado en la Universidad de California, en Sacramento (CSUS). Los lenguajes de programación permitidos son C/C++, Pascal y Java.


 * Algunos Tips Para Los Participantes**

Un buen equipo es esencial para tener éxito en un concurso de programación. Un buen equipo debe tener conocimientos estándares sobre algoritmos y la habilidad de encontrar el algoritmo apropiado para cada problema en el concurso. Además que, los equipos debe ser capaces de codificar los algoritmos y trabajar en equipo de manera eficiente.

Los problemas presentados en los concursos de programación caen casi siempre en cinco categorias: búsquedas, teoría de grafos, geometria, programación dinámica, triviales y los no estándar. Los problemas de búsquedas usualmente requieren implementar una búsqueda primero por anchura o primero por profundidad. Los problemas de teoría de grafos comunmente incluyen algoritmos como: el camino más corto, de flujo máximo, árbol de expansión mínima, etc. Los problemas geométricos están basados en geometría en general y geometría computacional (donde los algoritmos son más elaborados). Los problemas de Programación Dinámica son resueltos usando métodos tabulares (elección de soluciones particulares óptimas que aseguren una solución óptima general). Los problemas triviales engloban los fáciles o que se pueden resolver sin muchos conocimientos sobre algoritmos, como los problemas relacionados con números primos. Los problemas No-Stándar son aquellos que caen en ninguna de éstas categorías, como las simulaciones, el problema de las n-reinas, o problemas basados en artículos de investigación.


 * Lo Que Deberías Hacer Para Armar Un Buen Equipo**

No hay una fórmula mágica para volverse un buen equipo, sin embargo, observando los puntos anteriores tu puedes mejorar. En el entrenamiento, asegurarse de que cada miembro del equipo domine lo básico, como escribir funciones, "debuguear", y compilar. Un equipo efectivo tendrá miembros con especialistas de tal forma que contenga un experto en búsquedas, recorridos de grafos, programación dinámica, y matemáticas. Todos los miembros del equipo deben conocer las fortalezas y debilidades de los otros y comunicarse de forma efectiva entre ellos. Esto es importante, en el momento de decidir que miembro resolverá cada problema. Simpre pensar en el bien del equipo. Resolver problemas juntos también puede ser de gran ayuda. Esta estrategia funciona cuando el conjunto de problemas se vuelve difícil. Esta estrategia también es buena para equipos que se enfocan en resolver un problema de forma intachable. Por otro lado, la forma más eficiente de escribir un programa es escribirlo solo, evitando comunicaciones extrañas y la confusión causada por diferentes estilos de programación.

Como en toda competencia, entrenar bajo circunstancias similares al concurso es de gran ayuda. Durante el concurso asegurate de leer todos los problemas y clasificarlos en fácil, medio y díficil. Tomar los más fáciles es usualmente una buena idea. Si es posible, revisa el score actual y busca el problema que ha sido más veces resuelto. Si ese problema no ha sido resuelto por tu equipo, intenta resolverlo inmediatamente, seguramente es un problema fácil de resolver. Además, si tu solución para un problema fácil es rechazado en un concurso por errores mínimos, es buena idea tener a un miembro que revise el problema. Cuando los jueces rechazan tu solución, intenta pensar acerca de los posibles errores antes de empezar a depurar. La depuración en tiempo real es el último pecado, no pierdas mucho tiempo con un simple problema. En un concurso de 5 horas tienes 15 horas por persona y 5 horas por computadora. Es decir, que las horas de computadora son extremadamente valiosas. Trata de no dejar la computadora inactiva. Una manera de mantenerla activa es usarla solo para codificar y no para pensar. Puedes ahorrar horas de computadora escribiendo tu programa en papel, analizandolo, y después usar la computadora. Por último, es importante recordar que el sistema de puntaje en un concurso es digital. No obtienes puntos por resolver el 99% del problema. Al final del concurso puedes haber resolvido todos los problemas en un 90% y tu equipo está en el fondo de la lista.

**Diferentes Tipos de Respuestas del Juez**
Estás son los diferentes tipos de respuestas que puedes encontrar en un concurso:


 * Correct**

Tu programa debe leer la entrada de un archivo o de la entrada estándar de acuerdo a las especificaciones del concurso. Los jueceses probaran tu programa con sus casos de entrada. Si la salida de tu programa coincide con la salida de los jueces, tu programa será catalogado como correcto.


 * Wrong Answer**

Si la salida de tu programa no coincide con la esperada por los jueces, obtendrás una notificación de Respuesta Incorrecta. Generalmente, una respuesta incorrecta ocurre cuando has entendido mal el problema, subestimar el problema, no revisar los casos extremos o simplemente por no contar con la suficiente experiencia para resolverlo. Los problemas frecuentemente tienen detalles que pasan desapercibidos por no leer cuidadosamente el problema.


 * No output**

Tu programa no produce una salida. Generalmente por interpretar de forma incorrecta el formato de entrada.Por ejemplo, puede haber confusiones el nombre del archivo de entrada, por ejemplo, el juez proporciona la entrada como "a.in", pero tu programa está leyendo desde "b.in". También es posible que la ruta proporcionada en tu programa no sea correacta. El archivo de entrada, en la mayoría de las veces, se encuentra en el directorio actual.


 * Presentation Error**

Este error indica que tu prorama realiza una operación ilegal mientras ejecuta la entrada del juez. Algunas operaciones inválidas pueden ser hacer referencia a memoria inválida o sobrepasar el rango en un arreglo. Existen también numerosos errores matemáticos muy comunes como la división entre cero, desbordamientos y un error en el dominio.


 * Time limit exceeded**

En un concuros, el juez especifica el tiempo limite para cada problema. Si tu programa no termina en el tiempo especificado, obtendrás este error. Es muy probable que estés usando un algoritmo ineficiente, por ejemplo, cuando tratas de obtener el factorial de un número de forma recursiva, o tal vez cuando tienes un bug y tu programa entra en un ciclo infinito. Un error más común es que tu programa intente leer desde la entrada estándar cuando el juez especifica que sea desde un archivo. Otro error relacionado se produce cuando se asume que el fin de la entrada estará dado por un caracter, por ejemplo, "#" cuando en realidad termina con un fin de archivo.