Sigueme en Twitter

El Proyecto Euler: Problema 1

18/05/2008

El Proyecto Euler es una serie de problemas de programación, si quieres enterarte de que va esto, lee la introducción.

Problema 1

Si listamos todos los números naturales debajo de 10 que son múltiplos de 3 o 5, tenemos 3, 5, 6 y 9. La suma de estos múltiplos es 23.

Encuentra la suma de todos los múltiplos de 3 o 5 debajo de 1000.

Este problema lo he visto como de los ‘recomendados’ para poner en las entrevistas para trabajo, simple y rápido, te dice claramente las 3 condiciones a evaluar.

El operador % regresa el residuo de una división, por lo que podemos iterar de uno en uno hasta el límite superior (1000) y verificar si cada número es perfectamente divisible (el residuo es 0) entre 3 o 5, entonces lo podemos almacenar.

Resuelto en C.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
main()
{
    int sum = 0, i;
    for ( i = 1; i < 1000; i++ )
    {
        if ( (i % 3 == 0) || (i % 5 == 0) ) {
            sum += i;
        }
    }
 
    printf("El resultado es: %d", sum);
}

Conclusión

Comparando con resultados del Proyecto Euler, si bien la solución de fuerza bruta que hice no esta mal, si la pregunta exigiera un limite con cantidades grandes no es eficiente hacer un loop comparando resultado por resultado, sino que es mejor calcular las operaciones por separado.

La suma de números divisibles por 3, la suma de números divisibles por 5 y restando finalmente los números divisibles por 15 que sino tendríamos los divisibles comunes de 3 y 5 contados 2 veces. Se puede evadir por completo cualquier loop si utilizamos progresiones aritméticas.

Para poner un poco en contraste, haciendo benchmark (utilizando gprof) de mi solución para el limite de 1 billón (si si, un uno seguido de 9 ceros), este laptop tarda 15.68 segundos.

En cambio la siguiente versión (versión de sandippal en el foro) que utiliza este principio, tarda menos de .01 segundo, ¿bastante no?.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#define NUM 999999999
 
main()
{
  unsigned long long mult3  = NUM / 3;
  unsigned long long mult5  = NUM / 5;
  unsigned long long mult15 = NUM / 15;
  unsigned long long sum3, sum5, sum15;
 
  sum3 = 3  * mult3  * (mult3 + 1) / 2;
  sum5 = 5  * mult5  * (mult5 + 1) / 2;
  sum15 = 15 * mult15 * (mult15 + 1) / 2;
 
  printf("resultado: %lld\n", sum3 + sum5 - sum15);
}

Gracias en especial al comentario de Xiam, grande su explicación.

13 Comentarios

El Proyecto Euler

18/05/2008

¿Que es el Proyecto Euler?

El Proyecto Euler es una serie de retadores problemas de matemática/programación que requerirán mas que un poco de conocimientos de matemáticas para resolver. Aunque las matemáticas te ayudarán a tener métodos elegantes y eficientes, el uso de la computadora y habilidades de programación son requeridos para resolver la mayoría de los problemas.

Desde hace tiempo he querido avanzar con ellos y mi desidia no me ha dejado, así que ahora publicaré los problemas que vaya resolviendo (si, uno por uno) y de paso me doy motivación extra.

También es una perfecta oportunidad para que la vasta fauna del internet pueda corregir mi imperfecta manera de programar, así que cualquier corrección no duden en hacerla, mientras mas me equivoco mas aprendo.

Algunas cosas que notar:

  • Siempre agradeceré que revisen el problema y den su opinión, planeo equivocarme bastante. Los problemas se encuentran si buscamos en el internets o en la página del proyecto, pero el punto es pensar un poco y hacerlo uno mismo, lo demás es perder el tiempo.
  • No pienso leer las respuestas que vienen en el Proyecto Euler hasta que no haya pasado un tiempo considerable desde que lo resolví, entonces publicare la conclusión.
  • Siempre buscare que el programa sea mas eficiente, y por eficiente se entiende que el algoritmo ejecute en menos ciclos de maquina, por lo tanto en menos tiempo. No me importa desarrollar superhabilidades para escribirlo en el menor número de lineas ininteligibles posible.
  • Los quiero hacer todos en C para aprender, así tarde tres veces más y cometa muchos errores como n00b que soy, no me importa, desde la carrera técnica no lo utilizo y ya dan ganas :-)
  • Si planeas hacerlos por tu cuenta, no leas esto antes! básicamente es un spoiler.

Listado de problemas:

  • Problema 1 - Suma todos los números naturales menores a 1000 que son múltiplos de 3 o 5.
  • Problema 2 - Encuentra la suma de todos los números pares en una secuencia de Fibonacci que no pase los 4 millones.
3 Comentarios

Una tienda friki

18/05/2008

Me imaginaba que el día que me encontrara una tienda con este nombre sería.. no se.. ¿friki?

Tienda Friki

Kudos para munix que la noto, yo soy tan distraído que desde el año pasado pasaba por aquí y nunca la vi.

3 Comentarios

¿Para que usar el X-JSON de Prototype?

15/05/2008

En un canal de IRC, hoy una persona me hizo recordar un problema que tuvimos hace un par de semanas en la oficina porque los datos en JSON que regresaba una web, mágicamente desaparecían aun cuando antes estaba funcionando.

En ambos casos fue el mismo error, no se tenia contemplado que los datos enviados fueran a crecer demasiado eventualmente, y como X-JSON utiliza los headers de HTTP, tiene un tamaño limitado.

Yo realmente no le veo el punto de su existencia, ¿enviar estados de una página? ¿mensajes cortos? Para eso mejor utilizar headers correctos de HTTP y cualquier tipo de datos por el cuerpo de la página como fue pensado desde el principio, la confusión que puede crear es mayor que el beneficio.

Si lo dejas a mi opinión: No lo uses, evítalo.

1 Comentario

Google Developer Day en México

11/05/2008

Este año viene por primera vez el Google Developer Day a la Ciudad de México, mas específicamente al centro Banamex.

Para cualquier interesado en desarrollo web es una conferencia atractiva, es todo un dia de conferencias y talleres de código sobre herramientas de Google, incluyendo “OpenSocial, Android, Google Web Toolkit, Google Gears, Mapas/KML y más”.

El evento es gratis, asi que no hay excusa, a mi me ha convencido Luis (a.k.a. GoogleFan) de registrarme, así que estaré por el DF el 23 de Junio.

10 Comentarios

Ironman

4/05/2008

Se que han leído acerca de esta pelicula en otros 50 lugares, pero aun así tenia que recomendarla.

No es una obra de arte y no pasara a la historia del cine, es solo que las películas de personajes salidos de un comic siempre han sido un tanto malitas, toman temas tan fantásticos que terminan pareciendo un refrito de los Power Rangers. Podría decir que es la mejor adaptación de cualquier personaje mayor de comic que he visto.

Como sea, la historia esta bien, los efectos están bien y sobre todo, el papel de Robert Downey Jr como Tony Stark esta muy bien, le queda 100% el paquete. Si puedes, ve a verla.

Ironman

8 Comentarios

La cita del día

2/05/2008

“Saying that Java is nice because it works on all OS’s is like saying that anal sex is nice because it works on all genders”

Vía | bash.org

3 Comentarios

Una lavada de cara

2/05/2008

He cambiado el diseño del blog, después de dejarlo ‘para luego’ desde hace año y medio.

No se me da eso del diseño, así que tome de base el excelente tema Vostok de Javier Cañada, diseñador para Idealista.com, modificando algunas cosas aquí y allá. También por fin agregue sección equivalente a ‘Acerca de‘ y ya no me importo publicar el email en ‘Contacto‘.

Lo mas tedioso fue quitar dependencias de plugins extremadamente ancianos que aún estaban instalados, y dejar los menos posibles, ya que no me hace gracia estar actualizándolos cada cierto tiempo.

Y lo mas tardado fue recategorizar los post, ya que antes utilizaba un plugin que agregaba las categorías dinámicamente a manera de tags, y eso me causo que tuviera 10008000 desordenadas categorias.

Mas vale tarde que nunca.

10 Comentarios

Firebug y Firefox 3 beta 5

27/04/2008

No entiendo porque con la actualización de Hardy nos obligaron a utilizar la Beta de Firefox, que en realidad no es mala (a mi me va mucho, mucho mas rápido) pero la gran mayoría de extensiones no funciona en ella aún.

En mi caso Firebug es indispensable para trabajar y la versión beta de su sitio no sirve para nada, por lo que uso una versión que compartió un usuario de los foros de ubuntu. Solo descargalo y arrastralo hacia la ventana de addons y listo.

firebug-1.2.0a20X.xpi

12 Comentarios

Se busca compañero de borrachera

22/04/2008

El buen Pedro Jareño, gran periodista, cómico y compañero de trabajo va a hacer una viaje de esos dignos de envidia.

Tal vez ya lo han leído en otro lado (Enrique Dans, Loogic), pero de todos modos lo cuento. Minube esta organizando un viaje alrededor del mundo, Pedro va a visitar 14 ciudades en varios continentes en unos muy bien organizados 2 meses.

Según sus propias palabras “La idea de este viaje va ligada a descubrir el mundo y servir de nexo entre blogueros y emprendedores hispanos que se encuentren esparcidos por el planeta para charlar con ellos”, ustedes saben, networking intercontinental del bueno. Aprovechando se harán entrevistas a bloggers de aquí y de allá, y ya ha empezado en Madrid con Enrique Dans.

México no se podía quedar atrás, y aunque no vaya a visitar la perla tapatía (déjenlo, el se la pierde), si que visitara la Ciudad de México alrededor del 10 de Junio, así que si alguien gusta verse por allá y echar una platica con el buen Pedro, solo avísenos.

No esta por mas decir que Pedro es todo un personaje y buen espécimen español.

7 Comentarios