Skip to Content

No te olvides de visitar:

Software libre, Software Propietario, Programación, Humor, Varios, PHP, MySQL, Libros

Reto PHP II: Test de Primalidad

Encaramos la llegada de los primeros fríos invernales con un nuevo reto PHP, está vez se trata de obtener un algoritmo que nos diga (con 100% de seguridad, nada de probabilidades) si un número (sea cual sea el tamaño) es primo o no.

El reto consiste en crear una función a la que pasamos una cadena con un número, y nos devuelve true (en caso que sea primo) o false (en caso que no sea primo). Tened en cuenta que el número que le pasemos puede tener cualquier tamaño, así que ya podéis echar mano de las librerías que hay en php para manejo de grandes números.

En esta ocasión ganará el algoritmo que devuelva el resultado correcto en el menor tiempo posible (la batería de pruebas cubrirá números pequeños, grandes, etc...).

  • Fecha Límite: 1 de Diciembre

Suerte y al lío.

PD: No se pueden utilizar funciones que hagan el trabajo por nosotros, como por ejemplo "gmp_prob_prime" o "gmp_nextprime".

Resultados del Reto PHP I

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.

Reto PHP I: Obtener los divisores de un número

Hoy desde "El Rincón de Tolito" inauguramos una nueva sección: "RETOS PHP", la idea es la siguiente: yo(podéis enviarme ideas para nuevos retos) propongo desde aquí un reto con sus condiciones, y vosotros vais enviándome vuestras soluciones en forma de comentario del post (los comentarios están moderados, y por tanto no aparecerán publicados hasta el final del concurso), o por correo electrónico (tolito(arroba)gmail(dot)com). Una vez terminado el plazo publicaré los códigos ganadores, así como sus autores. Así que vamos al lío con el primer reto:

RETO PHP I

Enunciado: Desarrollar una función llamada "reto" a la cual la pasemos un número (integer) y nos devuelva un array (divisor[0]=x....divisor[n]=y) con todos los divisores de dicho número, incluyendo el 1 y el propio número.

Códigos Ganadores: Hay 2 premios:

  • Código veloz: Después de una batería de pruebas(serán las mismas para todos) se verá cual es el código más rápido de todos los participantes.
  • Código breve: Este premio se lo llevará el código que menos ocupe, así que a abreviar...

Condiciones:

  • Las pruebas se llevarán a cabo en un servidor Ubuntu con Apache y PHP 5.2.5.
  • Cada usuario puede enviar 2 programas, así puede optar a los 2 premios a la vez, ya que es complicado que el mismo código gane los 2 premios, aunque nunca se sabe...
  • El envío debe incluir el nick del autor, una dirección de correo electrónico (no se hará publica para evitar spameos), y el código de la función.
  • Fecha límite para el envío de respuestas: 30 de Septiembre del 2009
  • El código que no funcione, o que de errores no será considerado valido. Puede dar warnings o notice siempre que funcione correctamente

¡Animo a todos y a optimizar código!

Actualización [28 Agosto 2009 - 14:41]: Ya hemos recibido los primeros programas...

Actualización [01 Septiembre 2009 - 10:50]: Siguen llegando programas, pero todos son para el premio de brevedad...a ver si alguien se anima a optimizar el código para mejorar su rendimiento.

Actualización [02 Septiembre 2009 -19:21]: En el premio a la brevedad solo se tendrá en cuenta la función, no os preocupeis de etiquetas php y demás historias...

Ciclo de la Fundación (Isaac Asimov)

Categoría:

Hace unos días que he terminado de leer el séptimo libro del ciclo de la Fundación, y no podía pasar sin recomendarlo a todo el mundo, es sin duda la mejor saga de ciencia ficción que he leído (por encima de los cantos de Hyperion y de la saga de Ender). El Ciclo de la Fundación está formada por los siguientes libros:

    • Preludio a la Fundación(1988)
    • Hacia la Fundación(1993)
    • Fundación(1951)
    • Fundación y Imperio(1952)
    • Segunda Fundación(1953)
    • Los Limites de la Fundación(1982)
    • Fundación y Tierra(1983)

La trilogía original (desde "Fundación" a "La Segunda Fundación") de esta saga es la única en toda la historia que ha recibido el "Premio Hugo a la mejor serie de ciencia ficción de todos los tiempos".

Yo los he leído en el orden cronológico que fueron escritos, y es el orden en el que recomiendo leerlos. Asimov escribió los cuatro últimos libros 30 años después que el resto de la saga, debido a las insistentes peticiones de sus lectores, y están a la misma altura que los primeros.

Una vez terminada la saga he descubierto que se han unido 3 de los mejores escritores de ciencia ficción actuales (son conocidos como las 3 b's de la Ciencia Ficción): Gregory Benford,Greg Bear y David Brin, y han continuado la saga con "La Segunda Trilogía de la Fundación", en la que se cuenta parte de la vida de Hari Seldon.... La nueva trilogía está formada por:

    • El Temor de la Fundación (Gregory Benford)(1997)
    • Fundación y Caos (Greg Bear)(1998)
    • El Triunfo de la Fundación (David Brin)(1999)

Yo acabo de empezar el primero de esta nueva trilogía ("El temor de la Fundación" de Gregory Benford) y sinceramente me esta resultando un poco pesado...el estilo de Benford se enreda mucho en descripciones y diálogos...Asimov es mucho más escueto y directo, pero bueno creo que podré llegar al final de esta nueva trilogía...ya os contaré.

Un saludo a todos, y perdón por mis largas ausencias...:)

Presente y futuro de MySQL

Son muchos los proyectos de Software libre que usan como base de datos MySQL, y los que hayáis seguido un poco la historia de MySQL os preguntareis que va a pasar con este pedazo de sistema gestor de bases de datos.... Para los que andeis más despistados voy a poneros en antecedentes:

  • 1994: Michael Widenius and David Axmark desarrollan MySQL.
  • 26 Febrero 2008: Sun compra MySQL por 1.000 millones de dolares. Al poco tiempo MySQL se divide en dos versiones, la versión enterprise (versión de pago que incluye soporte y demás) y la community Server (versión totalmente gratuita).
  • 20 Abril 2009: Oracle anuncia la compra de Sun por 7.400 millones de dólares
  • 13 Mayo 2009: Michael Widenius (fundador de MySQL) funda la Open Database Alliance.
  • Actualidad: La comunidad de software libre se pregunta que será de MySQL.

Como veis los chavales de Oracle lo han hecho bastante bien...como Oracle no podía adquirir directamente MySQL (le hubieran denunciado por intento monopolístico) utilizan como intermediario a Sun Microsystems para hacerlo, al poco tiempo Oracle adquiere Sun acabando así con su principal competidor en el mundo de las bases de datos.

Entonces, ¿que salida le queda a MySQL? Pues la salida más lógica es un fork de MySQL...uno de sus creadores (Michael Widenius) en cuanto vio que Oracle quería acabar con MySQL fundó la Open Database Alliance para garantizar la continuación de MySQL, asegurando (al menos eso espero) el futuro de este.

Solo queda esperar al próximo movimiento por parte de Oracle...

Un saludo a todos

Lorem Ipsum...ese gran desconocido

Categoría:

Muchos de vosotros habréis visto un montón de veces un texto como este:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat...

Este texto, usado en plantillas web, demostraciones de tipografías (aparte del murciélago hindú que como kiwi), etc... pertenece a una obra de Cicerón: De finibus bonorum et malorum (Sobre los límites del bien y del mal) del año 45 a.c.

Se usa un texto en latín para que así centremos la atención en el diseño, olvidándonos del texto....si queréis consultar el texto completo lo tenéis en http://es.lipsum.com/. Y si sois diseñadores y necesitáis colocar texto de relleno en vuestro diseños, existen algunos generadores de Lorem ipsum.

Los más curiosos se preguntarán que significa toda esa retahíla latina, la respuesta (traducción del pasaje al que pertenece el Lorem ipsum):

Ni tampoco hay nadie que ame, persiga y quiera alcanzar el dolor mismo porque sea dolor, sino porque a veces se dan las circunstancias de tal manera, que con esfuerzo y dolor puede obtener algún gran placer. En efecto, para ir a cosas insignificantes, ¿quién de nosotros asume algún ejercicio físico trabajoso si no es para conseguir alguna ventaja de él? Por otra parte, ¿quién censuraría con razón a aquel que quiere estar en un placer al que no siga ninguna molestia, o a aquel que huye del dolor con el que no se produce ningún placer? Pero sin duda acusamos y juzgamos como los más dignos de un justo aborrecimiento a aquellos que, ablandados y corrompidos por el encanto de los placeres presentes, cegados por el deseo, no prevén los dolores y las molestias que han de sucederles, y están en falta semejante quienes abandonan sus deberes por debilidad de espíritu, es decir, por huir de esfuerzos y dolores.

Esto es todo amig@s...:)

Script PHP para obtener los enlaces de una página Web

Categoría:

Vamos a ver como gracias a la "DOM Extension" de PHP podemos extraer todos los enlaces de una página web con un sencillo script PHP, sin necesidad de complicarnos con expresiones regulares.

Aquí os dejo un ejemplo muy sencillo comentado para que veáis como funciona:

<?php
  //Decimos a libxml que no muestre errores
  $original_config = libxml_use_internal_errors(true);
  libxml_clear_errors();

  //Cargamos el archivo html
  $html = new DOMDocument();
  $html->loadHtmlFile('http://www.chungarratadas.com');

  //Usamos DOMXPath para buscar los enlaces (/a)
  $xpath = new DOMXPath($html); 
  $enlaces = $xpath->query('//a'); 

  //Recorremos todos los enlaces encontrados y mostramos la url(href)
  foreach ($enlaces as $enlace) 
  { 
    echo $enlace->getAttribute('href')."<br/>";
  } 

  //Devolvemos a su estado original el reporte de errores de libxml
  libxml_clear_errors(); 
  libxml_use_internal_errors($original_config); 

?>

Un saludo a todos!

Longevidad de las distros de Linux

Como hace unos días ha sido el 5º Aniversario de Ubuntu, la gente de Mundo Geek ha hecho está gráfica en la que muestra la longevidad de las distros más populares de Linux:

Distros de Linux

Quería aprovechar para citar una frase que he leído en los comentarios de Meneame y me ha hecho gracia:

Ubuntu es la manera africana de decir "no tienes huevos de instalar una Debian"

Un saludo a todos!

LAST_INSERT_ID(): Obtener el último ID insertado en MySQL

Categoría:

Hoy vamos a ver como obtener el ID del último INSERT que hemos hecho en la base de datos (muy útil sobre todo en el caso de que el ID sea un "auto increment"). Si no conocéis LAST_INSERT_ID, las 2 soluciones que tenéis son un poco cutres:

  • Hacer una consulta "SELECT max(id) FROM tabla" (así obtenedremos el ID más alto de la tabla), poco recomendable porque puede ser que alguien agrege otro registro mientras hacemos nosotros la consulta, con lo cual no estariamos obteniendo el ID del registro que queremos.
  • La otra alternativa es realizar una consulta poniendo como condiciones la información de los campos que acabamos de meter. Ejemplo: hemos agregado un usuario que se llama paco pil, ha nacido el 2000/12/12, entonces hacemos: "SELECT id FROM tabla WHERE nombre='paco' and apellidos='pil' and fechanac='2000/12/12'". Esta opción suele ser más efectiva, en caso de que no tengamos registros repetidos, pero es bastante más costosa...ya que hay que escribir mucho código.

La opción más correta es utilizar LAST_INSERT_ID, para ello nada más que tenemos que hacer la siguiente consulta:

SELECT LAST_INSERT_ID() FROM tabla

Tenéis que tener en cuenta que LAST_INSERT_ID() va asociado a la conexión actual, por tanto si cerramos la conexión, abreimos una nueva y consultamos el LAST_INSERT_ID nos devolverá 0, ya que es una conexión nueva en la que no hemos hecho ningún INSERT.

Si tenéis alguna duda, podéis obtener más información en la documentación oficial de MySQL.

Id por la sombra.

Nota: Si probais el LAST_INSERT_ID desde el Mysql Query browser siempre os devolverá 0, ya que esta aplicación crea una conexión distinta para cada consulta.

El nuevo Internet Explorer 8 da 20/100 en el Acid Test 3

Ayer se anuncio a bombo y platillo en todas las televisiones, prensa, Internet, etc... el lanzamiento del nuevo y flamante Internet Explorer 8.0. Hoy he probado a actualizar para comprobar las mejoras insitu, y la verdad es que en temas de standares ha mejorado un montón (ironía), este es el resultado en el Acid Test 3:

Acid Test 3

Digo que ha mejorado, porque con la versión 7 del Internet Explorer el resultado era de 12. Para que os hagáis una idea de como pasan este test el resto de navegadores, aquí os dejo una lista de los resultados obtenidos con IE, Firefox, Opera, Chrome y Safari:

  • Internet Explorer 7.0.5730.13: 12/100
  • Internet Explorer 8.0.6001.18702: 20/100
  • Firefox 3.0.7: 71/100
  • Opera 9.64: 85/100
  • Safari 3.1.1: 75/100
  • Chrome 1.0.154.48: 79/100

No tengo más navegadores con los que probarlo ahora mismo...pero yo creo que queda claro lo buen navegador que es el Internet Explorer en cuanto a cumplimiento de estándares se refiere.

Un saludo!

Distribuir contenido