[RETO] Project Euler 1

Iniciado por Psyke1, 23 Enero 2013, 12:15 PM

0 Miembros y 4 Visitantes están viendo este tema.

MCKSys Argentina

Cita de: BlackZeroX (Astaroth) en 24 Enero 2013, 14:12 PM
Me estoy dando cuenta que el código es SIMILAR pero no igual al de MCKSys Argentina (Saca una sumatoria hasta 15, en base a un análisis similar)... me di cuenta ya tarde...

Creo que la idea es muy similar: En mi caso dividí la cosa en 3 partes: la sumatoria de los multiplos de 3, la de los de 5 y la sumatoria de las "colisiones" entre ambos. La primera cuenta calcula la suma de todos los "15"s que hay entre 3 y el numero dado. Luego calculas la suma de los multiplos de 5 y le resta los ya obtenidos y por ultimo hace lo mismo pero con los de 3.

La formula n * (n+1) / 2 me vino al pelo para reemplazar la sumatoria 1..n y asi quitar los bucles.

En fin, creo que este reto ya ha sido superado y convendria pasar al siguiente, aunque, bueno, no se si estan todos de acuerdo...  :)

Saludos!

PD: @BlackZeroX: Esta noche, cuando llegue a casa, hago benchmarks con compilados!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Psyke1

Cita de: MCKSys Argentina en 24 Enero 2013, 16:18 PM
En fin, creo que este reto ya ha sido superado y convendria pasar al siguiente, aunque, bueno, no se si estan todos de acuerdo...  :)

¡Eso creo yo también!
Es genial que se participe tanto, porque la verdad es que vuestras formas de hacerlo no se me hubieran ocurrido. :D
Voy a crear el segundo reto.

DoEvents! :P

LeandroA

Bueno esta es la mía, pero solo responde el enunciado de la pagina no tiene mas opciones.

Código (vb) [Seleccionar]

Private Function Euler1_LeandroA() As Long

    Dim i As Long, lResult As Long, lSum As Long
   
    For i = 1 To 999 \ 3 Step 3
        lSum = lSum + (i * 9) + 9
    Next
   
    For i = 1 To 999 \ 5 Step 5
        lResult = (i * 25) + 25
        If (lResult Mod 15) Then lSum = lSum + lResult
    Next
   
    Euler1_LeandroA = lSum - 15

End Function

rob1104

Va el mio, seguro gano al mas lento  ;D

Código (vb) [Seleccionar]
Function robEuler1() As Long
    Dim i As Integer, suma As Long
    For i = 0 To 999
        If i Mod 3 = 0 Or i Mod 5 = 0 Then
            suma = suma + i
        End If
    Next i
    robEuler1 = suma
End Function


Saludos!!!
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.

imoen

HOla

Rob1104 , tu codigo es lo mas normal , y no es el mas lento me gusta por que es clarito simple y funcional

LeandroA, siento decirte que tu código es el mas lento de todo, o al menos eso creo , pq recorres el campo de datos 2 veces , aunque vallas haciendo los saltos de 3 y 5 ademas que los bucles for son quizá los mas lentos , eso combinado con que calculas el modulo te ponen en el codigo mas lento.


Una cosa el código sea lento no significa que sea el peor , pq insisto en que los códigos deben ser legibles y entendibles por cualquiera , un codigo muy veloz pero ofuscado tampoco es rentable a pesar de ser muy rapido pero bueno , que esta muy bien que haya de todo :)

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

Psyke1

Cierto, pero en estos retos se trata de exprimir al máximo la velocidad. Es indiferente que no sea bonito (en este caso en concreto).
Vale todo. ;)

DoEvents! :P

imoen

Pues te lanzo la version del reto 1.1

Como hay que hacerlo rapido , y di distribuyes cada calculo de busqueda los 3 por un lado y los 5 por el otro , peroo cada bloque aun core distinto del procesador :P  ( tambien me sirve si haces dos hilos y ejecutas los hilos a la vez ) uhh , en el caso de no haber cores pero tener HT pues es lo mismo, lo que no se es si VB6 permite el balanceo de carga por nucleos :P

bs imoen

PD -> como lo flipo ehh XDDD
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

MCKSys Argentina

En este caso, para mejorar la velocidad, solo tuve que analizar el problema, plantear diferentes ideas y usar matematica. Por lo que veo, BlackZeroX hizo lo mismo.

Recuerda que el procesador mas poderoso del planeta esta sobre tus hombros y es el UNICO que funciona mejor mientras MAS lo usas.  ;)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


BlackZeroX

#38
Cita de: imoen en 25 Enero 2013, 12:32 PM
Una cosa el código sea lento no significa que sea el peor , pq insisto en que los códigos deben ser legibles y entendibles por cualquiera , un codigo muy veloz pero ofuscado tampoco es rentable a pesar de ser muy rapido pero bueno , que esta muy bien que haya de todo :)

Los análisis matemáticos para no dejarle la carga a el CPU no es igual a ofuscar el código... de hecho cuando se tienen limitan-tes como en los PICS se deben usar mucho las matemáticas de cualquier índole.

Cita de: imoen en 25 Enero 2013, 12:46 PM
Pues te lanzo la version del reto 1.1

Como hay que hacerlo rapido , y di distribuyes cada calculo de busqueda los 3 por un lado y los 5 por el otro , peroo cada bloque aun core distinto del procesador :P  ( tambien me sirve si haces dos hilos y ejecutas los hilos a la vez ) uhh , en el caso de no haber cores pero tener HT pues es lo mismo, lo que no se es si VB6 permite el balanceo de carga por nucleos :P

bs imoen

PD -> como lo flipo ehh XDDD

Los hilos y balanceo por núcleo es inestable en VB6... sin en cambio solo son llamadas a APIS.

El código en C se parecería algo así... en VB6 sería prácticamente lo mismo.

void threadFunc()
{
    //  Codigo...
    ExitThread (dwAlgunValor);
}

// Los siguiente en algún proceso X como main()...

GetSystemInfo(&sysInfo);
printf("Numero de nucleos: %d.\n", (int)sysInfo.dwNumberOfProcessors);
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc, NULL, 0, &dwThreadId);

if (SetThreadAffinityMask(hThread, 1 << (bCoreToUse % 8)) != 0)
printf("ThreadAffinity se establecio con exito en el nucleo %d.\n", (int)bCoreToUse);
else
printf("ThreadAffinity error! El sistema repartira la carga del Thread!");

        if (!GetExitCodeThread (hThread, &dwRes)
printf("Imposible de obtener el resultado del hilo");
...



Aun así este proceso es MUY LENTO cuando ya se a generado una formula matemática a lápiz y papel la cual es la mas optima posible.

P.D.: Los programadores estamos muchos años atrasados en la tecnología debido a que SIEMPRE le dejamos el trabajo pesado al hardware...

Dulces Lunas!¡.
The Dark Shadow is my passion.

imoen

Hola

he estado investigando un poco sobre VB6 y aunque no tiene exactamente de forma nativa el uso de nucleos si que se puede hacer algun apaño

os dejo un link ;http://www.svcommunity.org/forum/vb/threads-o-hilos-en-vb6-0/

Claro en C si hay mas opciones , y estamos seguros que distribuir la carga a cada core es mas lento que la formulita matematica ?¿

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen