Autor
|
Tema: [RETO] Project Euler 1 (Leído 21,525 veces)
|
MCKSys Argentina
|
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!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.089
|
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. Voy a crear el segundo reto. DoEvents!
|
|
|
En línea
|
|
|
|
LeandroA
|
Bueno esta es la mía, pero solo responde el enunciado de la pagina no tiene mas opciones. 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
|
|
|
En línea
|
|
|
|
rob1104
Desconectado
Mensajes: 340
Usuario común
|
Va el mio, seguro gano al mas lento 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!!!
|
|
|
En línea
|
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.
|
|
|
imoen
Desconectado
Mensajes: 1.589
|
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
|
|
|
En línea
|
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
Wiki
Desconectado
Mensajes: 1.089
|
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!
|
|
|
En línea
|
|
|
|
imoen
Desconectado
Mensajes: 1.589
|
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 ( 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 bs imoen PD -> como lo flipo ehh XDDD
|
|
|
En línea
|
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!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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. 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 ( 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 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!¡.
|
|
« Última modificación: 25 Enero 2013, 23:51 pm por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
imoen
Desconectado
Mensajes: 1.589
|
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
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Projecto Euler problema 12
Ejercicios
|
lDanny
|
5
|
5,414
|
16 Octubre 2010, 04:33 am
por [L]ord [R]NA
|
|
|
[RETO] Project Euler 2
« 1 2 3 »
Programación Visual Basic
|
Psyke1
|
23
|
10,895
|
25 Enero 2013, 23:19 pm
por Danyfirex
|
|
|
[RETO] Project Euler 3
« 1 2 »
Programación Visual Basic
|
Psyke1
|
13
|
6,916
|
3 Febrero 2013, 20:45 pm
por imoen
|
|
|
[RETO] Project Euler 4
« 1 2 »
Programación Visual Basic
|
Psyke1
|
10
|
6,068
|
4 Febrero 2013, 23:32 pm
por imoen
|
|
|
Ayuda con el calculo de Pi por la Serie de Euler
Programación C/C++
|
Rollingman216
|
3
|
2,191
|
24 Agosto 2017, 04:09 am
por engel lex
|
|