Hola a todos, compañeros y amigos....después de un mes de intriga e incertidumbre, aquí llegamos con los resultados del 1º Reto PHP del Rincón de Tolito.
La participación ha sido bastante más alta de lo esperado...como podéis ver en los comentarios del reto (además de los que me lo habéis enviado al correo). Así que sin más preámbulos vamos a por los resultados.
PREMIO A LA BREVEDAD
Para Víctor con 63 caracteres:
function reto($n){for($i=$n;$i;$i--)($n%$i)||$a[]=$i;return$a;}PREMIO A LA VELOCIDAD
Para Guti (al que quiero felicitar desde aquí por su blog, y por el algoritmo) con este algoritmo:
function reto($piNumero)
{
$aRes=array($piNumero);
for ($iDivisor=$piNumero>>1; $iDivisor>0; $iDivisor--)
{
if (!($piNumero % $iDivisor))
{
array_push($aRes, $iDivisor);
}
}
return($aRes);
}
VERSIÓN PROPIA
Yo, aunque no participo en el concurso, he desarrollado un algoritmo que, aunque no es la panacea, si que mejora infinitamente el tiempo de respuesta (en números grandes la mejora es muy notable). Lo que hace es recorrer el bucle for entre 0 y la raíz del número, con lo cual nos ahorramos muchas pasadas por el bucle, aquí os dejo el algoritmo desarrollado:
function reto($x)
{
$t=ceil(sqrt($x));
if ($t*$t==$x)
$d[]=$t;
for ($n=1;$n<$t;$n++)
{
if (!($x%$n))
{
$d[]=$n;
$d[]=$x/$n;
}
}
return $d;
}
Un saludo a todos
Nota: Guti ha enviado una versión que precalculaba las factorizaciones de todos los números indicados y los guardaba en un archivo (unos 500 Gb(para el rango de enteros de php) calcula él que ocuparía). Yo la verdad no tengo espacio en disco suficiente para probarlo (ni paciencia para generar el archivo que precalcula los datos), pero creo que la búsqueda de un número en un archivo de texto de 500 Gb no debe ser una cosa muy rápida.

:) Saludos
:) Saludos
OK
Es cierto, no me había dado cuenta que ya estaban publicados en el post original.
Tienes razón en cuanto a la combinación de raiz cuadrada, junto con mis optimizaciones.
Comentarios...
Hola Guti, he hecho públicos todos los comentarios recibidos en el hilo original....así que allí podrás ver la mayoría de funciones recibidas.
Yo creo que se podría hacer una versión mucho más rápida si cabe, mezclando mi idea de la raíz cuadrada con las optimizaciones tuyas...si alguién tiene tiempo y ganas...:)
Un saludo y gracias a todos por participar....muy pronto en sus pantallas Reto PHP II :)
Gracias
Muchísimas gracias.
Como nunca te acostarás con alguien sin aprender algo nuevo, debo deciros que no conocía lo de $a[] para añadir un elemento nuevo al array, realmente revelador.
Sería curioso que publicaras las diferentes soluciones que se han enviado. Probablemente combinándolas, se podrían obtener grandes mejoras en tamaño y velocidad.
En cuanto a la versión precalculada, si no recuerdo mal, con números mayores de 10.000 ya era más veloz que la más rápida de las opciones.
Escribir un nuevo comentario