Algoritmo y números capicúas
27 diciembre, 2010 Deja un comentario
Un algoritmo no es algo que tiene ritmo (¿o sí lo tiene? veremos…). La definición reza “proceso especial para resolver, de modo mecánico, todos los problemas de un cierto tipo”; por ejemplo, la extracción de la raíz cuadrada de un número o el cálculo del máximo común divisor de dos números.”
Etimológicamente, pareciera que (según el Dr. Aurelio Baldor) la palabra “algoritmo” proviene del mundo árabe. Y tiene sentido! Nuestro sistema de numeración actual se basa en los “números arábigos” y un gran matemático musulmán, Al-Juarismi, dio al álgebra (al-gabr) la forma que después iba a ser clásica allá por el año 825. Al-gabr significa ecuación o restauración; al-muqabala son los términos que hay que agregar o quitar para que la igualdad no se altere.
Al-muqabala rima con cábala y me parece que son parientes… Ritmo significa, figurativamente, “orden acompasado en la sucesión de las cosas”, de modo que pareciera haber una sucesión acompasada entre las dos palabras; cuál precede/sucede a la otra… no lo sé por ahora. Algoritmo suena a “algo que tiene ritmo”; y no está, para nada, alejado de la realidad; porque “resolver algo mecánicamente” conlleva la periodicidad y el ritmo.
En el área de la programación de computadoras disponer de un algoritmo para resolver un problema en particular es esencial. Si hay que determinar los números capicúas en un determinado rango de números, por ejemplo, sería tener poco arte analizar cada uno de los números del rango para ver si lo es. Recordemos que capicúa es a los números lo que palíndromo es a las frases o palabras: «anilina», «dábale arroz a la zorra el abad», etc.
“El movimiento se demuestra andando…” –Carlitos Balá
Supongamos que tenemos como tarea imprimir los primeros 100 números capicúas de 4 cifras. O sea, todos los que están en el rango [0..9999]; diez mil números. El mayor número de cuatro cifras, sea o no capicúa, es el número 9999; si la cifra de los millares es igual a la cifra de las unidades y las dos del medio son iguales entre sí, entonces el número es capicúa. El 9999 es capicúa; y lo mismo valdrá para el 8888, el 7777, el 6666, etc. Ya tenemos diez. En cuanto a las dos cifras del medio, que tienen que ser iguales entre sí, y como en nuestro sistema de numeración disponemos de diez dígitos, deducimos sin mucha dificultad que habrá diez números capicúas de la forma n00n, n11n, n22n, n33n, etc. Sumados a los diez de la forma 0nn0, 1nn1, 2nn2, 3nn3, 4nn4, etc., tendremos 10 veces 10 números capicúas de cuatro cifras. Este análisis preliminar no tiene como objetivo tomarnos examen para saber cuán inteligentes somos sino para ir esbozando un algoritmo de programación. Ya lo dije más arriba: analizar cada uno de los 10.000 números individualmente para ver si es (o no) capicúa es tener poco arte; es no tener un algoritmo.
Ahora, con el esbozo algorítmico en mente, podremos comenzar a escribir líneas de código. La clave está en “10 veces 10” que nos indica hacer dos bucles anidados para recorrer todos los dígitos en el rango [0..9] 10*10 veces. Utilizando el lenguaje Visual Basic (universal), una primera aproximación sería la siguiente:
‘Imprimir todos los capicúas entre 0 y 9999 inclusive
Sub Print100Capicuas()
Dim i As byte, j As byte, capicua As integer
For i = 0 To 9
For j = 0 To 9
capicua = (1000 * i) + (100 * j) + (10 * j) + i
Debug.Print Format(capicua, “0000″)
Next j
Next i
End Sub
Pero,
1000i + i = 1001i
100j + 10j = 110j
luego, podremos refinar un poco más el código para que resulte de la siguiente forma:
‘Imprimir todos los capicúas entre 0 y 9999 inclusive
Sub Print100Capicuas()
Dim i As byte, j As byte, capicua As integer
For i = 0 To 9
For j = 0 To 9
capicua = 1001 * i + 110 * j
Debug.Print Format(capicua, “0000″)
Next j
Next i
End Sub
Así, hemos llegado a implementar un algoritmo para un determinado problema que es resuelto en 100 iteraciones en lugar de hacer 10.000 análisis individuales. Como no se me ocurre nada para refinar aún más el algoritmo lo doy por terminado así como está dejando abierta la posibilidad de que a alguien se le ocurra en el futuro la manera de darle una vuelta de tuerca más al asunto; siempre fue, es y será posible lograrlo. Por supuesto que el problema que originó el algoritmo aquí presentado puede llegar a parecer algo banal; pero es sólo un ejemplo ilustrativo y nada más que eso. No obstante ya estuve tanteando el tema usando capicúas de 5 y 6 cifras y no me ha ido mal. Algún día, con tiempo y ganas, procuraré alcanzar el algoritmo para imprimir los capicúas de cualquier cantidad de cifras. Por ahora, ya está bien; es suficiente.
La Prefectura Naval Argentina (PNA para abreviar), administrativamente hablando, es un aparato arcaico que se mueve lento, como un pesado dinosaurio desubicado en el tiempo que se merodea en pleno año 2010 ineficientemente sin que nadie, aparentemente, le haga ver lo mal que se está desempeñando . Por lo menos, en lo que respecta a su sección POLINAVE jurisdicción del Puerto La Plata, Argentina.