Capítulo 1

Página 14

Chapter 1.- Fundamental Concepts Capítulo 1.- Conceptos Fundamentales

Programming Contest is a delightful playground for the exploration of intelligence of programmers. To start solving problems in contests, first of all, you have to fix your aim. Some contestants want to increase the number of problems solved by them and the other contestants want to solve less problems but with more efficiency. Choose any of the two categories and then start. A contestant without any aim can never prosper in 24 hours online judge contests. So, think about your aim. [1] Los concursos de programación son una maravillosa plataforma para la exploración de la inteligencia de los programadores. Para empezar a resolver problemas en concursos, primero que todo, deberás de fijar un objetivo. Algunos concursantes quieren incrementar el número de problemas resueltos, y otros quieren resolver menos problemas pero con más eficiencia. Elige una de estas dos categorias y empieza. Un concursante sin objetivo nunca podrá prosperar en los concursos de jurado en linea de 24 horas. Así pues, piensa en tu objetivo (1).

If you are a beginner, first try to find the easier problems.Try to solve them within short time. At first, you may need more and more time to solve even simple problems. But do not be pessimistic. It is for your lack of practice. Try to solve easier problems as they increase your programming ability. Many beginners spend a lot of time for coding the program in a particular language but to be a great programmer you should not spend more times for coding, rather you should spend more time for debugging and thinking about the algorithm for the particular problem. A good programmer spends 10% time for coding and 45% time for thinking and the rest of the time for debugging. So to decrease the time for coding you should practice to solve easier problems first.

Si eres principiante, primero intenta encontrar los problemas más fáciles. Intenta resolverlos en un corto tiempo. Al inicio podrás necesitar más y más tiempo para resolver problemas sencillos. Pero no seas pesimista. Esto es por tu falta de práctica. Intenta resolver los problemas más fáciles, ellos incrementarán tu habilidad programativa. Muchos principiantes gastan mucho tiempo codificando el programa en un lenguaje de programación en particular, pero para ser un buen programador no deberías gastar mucho tiempo codificando, más bien deberías gastar más tiempo buscando errores y pensando en el algoritmo de el problema en particular. Un buen programador gasta 10% de tiempo en codificar, y 45% de tiempo pensando, y el resto de el tiempo buscando errores. Asi entonces decrementa el tiempo de codificación, deberias de practicar resolviendo los problemas más fáciles primero.

Do not try to use input file for input and even any output file for output when sending the program to online judges. All input and output parts should be done using standard input and outputs. If you are a C or C++ programmer try this, while coding and debugging for errors add the lines at the first line of the main procedure i.e.

No intentes usar un archivo de entrada para la entrada y aún, algún archivo de salida para la salida cuando envies tu solución a los jurados en linea. Toda entrada y salida deben de ser hechas usando las entradas y salidas Estándar. Si tu eres un programador de C o C++ intenta esto, mientras codificas y depuras tu código por errores agrega estas lineas al inicio de el procedimiento principal, es decir:

main { freopen(“NOMBRE_DE_ARCHIVO_PARA_ENTRADA”,”r”,stdin); freopen(“NOMBRE_DE_ARCHIVO_PARA_LA_SALIDA”,”w”,stdout); Resto de el código… return 0;}
 * 1) include 

But while sending to online judges remove the two lines with freopen to avoid restricted function errors. If you use the first freopen above, it will cause your program to take input from the file “FILE_NAME_FOR_INPUT”. Write down the inputs in the file to avoid entering input several times for debugging. It saves a lot of time. But as the function opens input file which can be a cause of hacking the websites of online judges they don’t allow using the function and if you use it they will give compilation error (Restricted Function). The second freopen is for generating the output of your program in a specified file named “FILE_NAME_FOR_OUTPUT” on the machine. It is very helpful when the output can’t be justified just viewing the output window (Especially for String Manipulation Problem where even a single space character can be a cause of...

Pero al enviarlo al jurado en linea elimina las dos lineas con freopen para evitar los errores de funciones restringidas. Si usas el primer freopen de arriba, causará que tu programa tome la entrada de el archivo “NOMBRE_DE_ARCHIVO_PARA_ENTRADA”. Ponga las entradas en el archivo para evitar introducir la entrada varias veces y producir errores al depurar. Esto ahorra mucho tiempo. Pero como la función abre el archivo de entrada lo cuál puede ser causa de hacking a las páginas web de los jurados en linea, ellos no ponen a disposición el uso de esta función y si lo usas te darán un error de compilación (Función Restringida). El segundo freopen es para generar la salida de tu programa en un archivo con el nombre especificado “NOMBRE_DE_ARCHIVO_PARA_LA_SALIDA” en la máquina. Esto es de mucha ayuda cuando la salida no puede ser justificada con tan sólo ver la salida de la ventana (Especialmente para Problemas de Manipulación de Cadenas donde aún cada caracter de espacio puede ser causa de...

Fin Página 14

Página 15

...Wrong answer). To learn about the function more check Microsoft Developer Network (MSDN Collection) and C programming helps.

...Wrong answer). Para aprender más acerca de una función revisa la Microsoft Developer Network (MSDN Collection) y las ayudas de programación del C.

Programming languages and dirty debugging Lenguajes de Programación y el sucio depurado.

Most of the time a beginner faces this problem of deciding which programming language to be used to solve the problems. So, sometimes he uses such a programming language which he doesn’t know deeply. That is why; he debugs for finding the faults for hour after hour and at last can understand that his problem is not in the algorithm, rather it is in the code written in that particular language. To avoid this, try to learn only one programming language very deeply and then to explore other flexible programming languages. The most commonly used languages are C, C++, PASCAL and JAVA. Java is the least used programming language among the other languages. Avoid dirty debugging.

La mayoria de veces un principiante encara el dilema de decidir cuál lenguaje de programación usará para resolver problemas. Entonces, algunas veces él usa como lenguaje de programación uno que no conoce profundamente. Esto es porque; el depura los errores por horas de horas y por fin puede entender que su problema no está en el algoritmo, más bien está en el código escrito en ese lenguaje en particular. Para evitar esto intenta aprender sólo un lenguaje de programación a profundidad y luego explora otros lenguajes de programación flexibles. Los más comunes son C, C++, PASCAL y JAVA. Java es el menos usado de entre los otros lenguajes. Evita el sucio depurado.

Avoid Compilation Errors Evita Errores de Compilación

The most common reply to the beginner from 24 hours online judge is COMPILATION ERROR (CE). The advices are,

La respuesta más común para el principiante de los jurados en línea de 24 horas es ERROR DE COMPILACION (CE). Los consejos son,

1) When you use a function check the help and see whether it is available in Standard Form of the language. For example, do not use strrev function of string.h header file of C and C++ as it is not ANSI C, C++ standard. You should make the function manually if you need it. Code manually or avoid those functions that are available in your particular compiler but not in Standard Form of the languages.

1) Cuando uses una función verifica la ayuda y observa si está disponible en la forma Estándar del lenguaje. Por ejemplo no uses la función strrev de la cabecerá string.h de C o C++ por no ser una función ANSIC, C++ C Estándar. Deberías hacer la función manualmente si la necesitas. Codifica manualmente o evita estas funciones que están disponibles en tu compilador particular pero no en la forma Estandar de los lenguajes.

2) Don’t use input and output file for your program. Take all the inputs for standard input and write all the outputs on standard output (normally on the console window). Check my previous topics.

2) No uses archivos de entrada y salida para tu programa. Toma todas las entradas por entradas estándar y escribe todas las salidas en salidas estándar(normalmente de la consola de window). Revisa los temas previos.

3) Do not use conio.h header file in C or C++ as it is not available in Standard C and C++. Usually don’t use any functions available in  header file. It is the great cause of Compilation Error for the programmers that use Turbo C++ type compiler.

3) No uses la cabecera conio.h en C o C++, pues no está disponible en el C y C++ Estándar. Usualmente no useas alguna función disponible en la cabecera . Es la más grande cauda de Errores de Compilación para los programadores que usan el compilador Turbo C++.

4) built-in functions and packages are not allowed for using in online judge.

4) las funciones incorporadas y paquetes no son tomados en cuenta por el jurado en linea.

5) Don’t mail your program i.e. don’t use yahoo, hotmail etc. for sending your program to judge as it is a complex method—write judge id, problems number etc. Rather use submit-system of the online judge for example, Submit page of Valladolid. Using the former will give you CE most of the time as they include there advertisements at the beginning and end of your program. So the judge can’t recognize the extra characters concatenated in your sent code and gives you CE. About 90% CE we ever got is for this...

5) No envies tu programa por correo, es decir, no uses yahoo, hotmail, etc. para enviar tu programa al jurado, existe un método complejo - escribir el id del jurado, el número de problema, etc. Es mejor que uses el sistema-de-presentación de cada jurado en línea, por ejemplo, la página de presentación de Valladolid. Usando la forma inicial descrita te dará la mayoría de las veces CE (Compilation Error), pues incluyen publicidad al inicio y al final de tu programa. Entonces el jurado no puede reconocer los caracteres extra concatenados en tu código enviado y te dará CE. Cerca del 90% de CE que alguna vez obtuvimos fue por esta...

Fin Página 15

Página 16

...reason. The mail system also breaks your programs into several lines causing Wrong Answer or Other Errors though your program was correct indeed. There are many famous online judges that can judge your solution codes 24 hours. Some of them are:

...razón. El sistema de correos también trunca tus programas en algunas líneas causando una respuesta errónea Wrong Answer u otros errores por más que el programa sea el correcto. Hay muchos famosos jurados en línea en los cuáles puedes verificar el código de tu solución las 24 horas. Algunos de ellos son:


 * ) Valladolid OJ (http://acm.uva.es/p)
 * ) Ural OJ (http://acm.timus.ru)
 * ) Saratov OJ (http://acm.sgu.ru)
 * ) ZJU OJ (http://acm.zju.edu.cn)
 * ) Official ACM Live Archive (http://cii-judge.baylor.edu/)
 * ) Peking University Online Judge (http://acm.pku.edu.cn/JudgeOnline/)
 * ) Programming Challenges (http://www.programming-challenges.com)

Forget Efficiency and start solving easier problems Olvida la eficiencia y empieza resolviendo los problemas más fáciles

Sometimes, you may notice that many programmers solved many problems but they made very few submissions (they are geniuses!). At first, you may think that I should try to solve the problems as less try as possible. So, after solving a problem, you will not want to try it again with other algorithm (may be far far better than the previous algorithm you used to solve that problem) to update your rank in the rank lists. But my opinion is that if you think so you are in a wrong track. You should try other ways as in that and only that way you can know that which of the algorithms is better. Again in that way you will be able to know about various errors than can occur. If you don’t submit, you can’t know it. Perhaps a problem that you solved may be solved with less time in other way. So, my opinion is to try all the ways you know. In a word, if you are a beginner forget about efficiency.

Algunas veces, podrías notar que muchos programadores resolvieron muchos problemas pero hicieron muy pocas presentaciones (ellos son unos genios!). Al principio, podrías pensar que deberías resolver problemas con la menor cantidad de intentos como sea posible. Entonces, después de resolver un problema, no querrás intentarlo otra vez con un diferente algoritmo (podría estar muy lejos de ser mucho mejor que el algoritmo previo que usaste para resolver ese problema) para subir tu posición en el ranking. Pero mi opinión es que si piensas que estás en la pista equivocada. Deberías de probar otras formas pues es la única manera de saber cuál de los algoritmos es mejor. Otra vez de esa manera podrás saber de errores diversos que puedan ocurrir. Si no presentas tu solución, no podrás saberlo. Quizá un problema que resolviste pudiese ser solucionado de otra forma en menos tiempo. Entonces, mi opinión es intentar todas las formas que tu sepas. En una palabra, si tu eres un principiante olvida todo acerca de la eficiencia.

Find the easier problems.Those problems are called ADHOC problems. You can find the list of those problems available in 24 OJ in S. Halim’s, acmbeginner’s, acmsolver’s websites. Try to solve these problems and in that way you can increase your programming capability.

Encuentra los problemas más fáciles. Estos problemas son llamados 'problemas ADHOC'. Puedes encontrar la lista de estos problemas disponibles en las páginas de: Jurados en Linea de 24 horas, S. Halim, acmbeginner, acmsolver, etc. Intenta solucionarlos y de esta manera incrementarás tu habilidad programativa.

Learn algorithms Aprenda Algoritmos

Most of the problems of Online Judges are dependent on various algorithms. An algorithm is a definite way to solve a particular problem. If you are now skilled in coding and solving easier problems, read the books of algorithms next. Of course, you should have a very good mathematical skill to understand various algorithms. Otherwise, there is no other way but just to skip the topics of the books. If you have skill in math, read the algorithms one by one, try to understand. Aft er understanding the algorithms, try to write it in the programming language you have learnt (This is because, most of the ...

La mayoria de los problemas de los jurados en linea dependen de varios algoritmos. Un algoritmo es una forma definitiva de resolver un problema en particular. Si ya eres un experto codificando y resolviendo los problemas más fáciles, lo siguiente es que leas libros de algoritmos. Por supuesto, debes de tener una muy buena habilidad matemática para entender varios algoritmos. En caso contrario, no hay otro camino más que saltar los capítulos de los libros. Si tu eres hábil en matemáticas, lee los algoritmos uno a uno, intenta entenderlos. Después de entender los algoritmos, intenta escribirlos en algún lenguaje de programación que sepas (Esto es porque la mayoría de ...

Fin Página 16

Página 17

... algorithms are described in Pseudocode). If you can write it without any errors, try to find the problems related to the algorithm, try to solve them. There are many famous books of algorithms. Try to make modified algorithm from the given algorithms in the book to solve the problems.

... algoritmos están escritos en Pseudocódigo). Si puedes escribirlos sin errores, intenta encontrar los problemas relacionados a el algoritmo, intenta solucionarlos. Hay muchos famosos libros sobre algoritmos. Intenta hacer algoritmos modificados de los algoritmos dados en los libros para solucionar problemas.

Use simple algorithms, that are guaranteed to solve the problem in question, even if they are not the optimum or the most elegant solution. Use them even if they are the most stupid solution, provided they work and they are not exponential. You are not competing for algorithm elegance or efficiency. You just need a correct algorithm, and you need it now. The simplest the algorithm, the more the chances are that you will code it correctly with your first shot at it.

Usa algoritmos simples, que garanticen la resolución del problema en cuestión, aún si no son ni los más óptimos ni las más elegantes soluciones. Úsalos aún si son las más estúpidas soluciones, siempre y cuando que ellos trabajen y que no sean exponenciales. No compites por la elegancia ni la eficiencia de los algoritmos. Sólo necesitas un correcto algoritmo, y lo necesitas ya. El más simple algoritmo, es el que más te da posibilidades de que lo codifiques correctamente en tu primer intento.

This is the most important tip to follow in a programming contest. You don’t have the time to design complex algorithms once you have an algorithm that will do your job. Judging on the size of your input you can implement the stupidest of algorithms and have a working solution in no time. Don’t underestimate today’s CPUs. A for loop of 10 million repetitions will execute in no time. And even if it takes 2 or 3 seconds you needn’t bother. You just want a program that will finish in a couple of seconds. Usually the timeout for solutions is set to 30 seconds or more. Experience shows that if your algorithm takes more than 10 seconds to finish then it is probably exponential and you should do something better.

Este es el mas importante consejo para continuar un concurso de programación. No tienes el tiempo para diseñar algoritmos complejos una vez que ya tengas un algoritmo que resuelva tu problema. La calificación se hace respecto a tu entrada, puedes implementar el más estúpido de los algoritmos y tener una solución que trabaje de inmediato. No menosprecies los microprocedores de hoy. Un bucle For, de 10 millones de repeticiones se ejecutará inmediatamente. Y si aún así tome 2 o 3 segundos no necesitas molestarte. Sólo necesitas un programa que termine en un par de segundos. Usualmente el tope de tiempo para las soluciones es de 30 segundos a más. La experiencia muestra que si tu algoritmo toma más de 10 segundos para terminar entonces es exponencialmente probable que debas de hacer algo mucho mejor.

Obviously this tip should not be followed when writing critical code that needs to be as optimized as possible. However in my few years of experience we have only come to meet such critical code in device drivers. We are talking about routines that will execute thousands of time per second. In such a case every instruction counts. Otherwise it is not worth the while spending 5 hours for a 50% improvement on a routine that takes 10 milliseconds to complete and is called whenever the user presses a button. Nobody will ever notice the difference. Only you will know.

Oviamente este consejo no debe de ser aplicado cuando se escribe código crítico que necesite ser tan optimizado como sea posible. Sin embargo en mis pocos años de experiencia nosotros hemos llegado a encontrar código tan crítico en adaptadores de dispositivos. Estamos hablando de rutinas que se ejecutarán miles de veces por segundo. En tal caso cada instrucción cuenta. De otra manera no tiene sentido gastar 5 horas para una mejora del 50% de una rutina que tarda 10 milisegundos para terminar y que es llamada cada vez que el usuario presiona un botón. Nadie se habrá dado cuenta de la diferencia. Sólo tu lo sabrás.

Simple Coding Codificación Simple

1. Avoid the usage of the ++ or -- operators inside expressions or function calls. Always use them in a separate instruction. If you do this there is no chance that you introduce an error due to post-increment or pre-increment. Remember it makes no difference to the output code produced.

1. Evita el uso de los operadores ++ o -- dentro de expresiones o llamadas a función. Siempre úsalas en una instrucción separada. Si haces esto, no habrá posibilidad que introduzcas un error debido al post-incremento o pre-incremento. Recuerda que esto no hace diferencia del código producido de salida.

2. Avoid expressions of the form *p++. 2. Evita expresiones de la forma *p++.

3. Avoid pointer arithmetic. Instead of (p+5) use p[5]. 3. Evita la aritmética de punteros. En lugar de (p+5) usa p[5].

4. Never code like: 4. Nunca codifiques así:

Fin Página 17

Página 18

return (x*y)+Func(t)/(1-s);

but like : sino como:

return (x*y)+Func(t)/(1-s); but like : temp = func(t); RetVal = (x*y) + temp/(1-s); return RetVal;

This way you can check with your debugger what was the return value of Func(t) and what will be the return code of your function.

De esa forma puedes comprobar con tu depurador qué valor retornó la Func(t) y que código retornará tu función.

5. Avoid using the = operator. Instead of : 5. Evita usar el operador de asignación (=). En lugar de:

return (((x*8-111)%7)>5) ? y : 8-x;

Rather use: Más bien use:

Temp = ((x*8-111)%7);    if (5<Temp) return y; else  return 8-x;

If you follow those rules then you eliminate all chances for trivial errors, and if you need to debug the code it will be much easier to do so.

Si sigues estas reglas, eliminarás toda posibilidad de errores innecesarios, y si necesitas depurar el código éste será mucho más fácil de hacerlo.

• NAMING 1 : Don’t use small and similar names for your variables. If you have three pointer variables don’t name them p1, p2 and p3. Use descriptive names. Remember that your task is to write code that when you read it it says what it does. Using names like Index, RightMost, and Retries is much better than i, rm and rt. The time you waste by the extra typing is nothing compared to the gain of having a code that speaks for itself.

• NOTACIÓN 1: No uses nombres pequeños ni similares para tus variables. Si tienes 3 variables tipo puntero no las llames p1, p2, y p3. Usa nombres que los describan. Recuerda que tu tarea es escribir código que cuando leas éste diga lo que hace. Usando nombres como Indice, MuyDerecha, y Reintento entenderás mejor qué es lo que hacen mejor que i, rm, y ri. El tiempo que se gasta por las letras extra es nada comparado a la ventaja de tener un código que hable por sí mismo.

• NAMING 2 : Use hungarian naming, but to a certain extent. Even if you oppose it help. (which, whether you like it or not, is a sign of immaturity) it is of immense help.

• NOTACIÓN 2: Usa la notación húngara (Link 1) (Link 2), excepto para una cierta extensión. Aún si te opones a esta ayuda. (lo cual, te guste o no, es un signo de inmadurez), pues esta notación es de inmensa ayuda.

• NAMING 3 : Don’t use names like {i,j,k} for loop control variables. Use {I,K,M}. It is very easy to mistake a j for an i when you read code or “copy, paste & change” code, but there is no chance that you mistake I for K or M.

• NOTACIÓN 3: No uses nombres como {i,j,k} para variables de control de bucles. Usa {I,J,K}. Pues es muy fácil confundir una j con una i, cuándo leas el código o cuando hagas un "copiar, pegar & cambiar", mas no habrá forma de que te equivoques poniendo una I por una K o por una M.

Last words Practice makes a man perfect. So, try to solve more and more problems. A genius can’t be built in a day. It is you who may be one of the first ten of the rank lists after someday. So, get a pc, install a programming language and start solving problem at once. [1] Ultimas palabras La práctica hace al maestro. Por lo que, intenta resolver más y más problemas. Un genio no puede forjarse en un día. Eres quien podría ser uno de los 10 primeros del ranking algún día. Así pues, consigue una pc, instala un lenguaje de programación y empieza a resolver problemas de una vez. [1]

Fin Página 18