[RETO] Project Euler 1

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

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

Psyke1

¿Qué os parece si hacemos todos los retos de Proyect Euler ?
Después se podría poner una chincheta con todos los ejercicios guardados. :)

¿Empezamos por el 1?
http://projecteuler.net/problem=1

DoEvents! :P

Danyfirex

#1
me parece excelente.  ;D
Aqui tienes a un participante. Por cierto pésimo en matemáticas. jajajaja

EDITO:

segun el problema dice esto.

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.


según lo que se 10 es divisible entre 5.

entonces la suma seria 33. o no ?


EDITO. 1


Si esta bien no leí la palabra below.

saludos


EDITO: 2

Aquí esta el mio.



Código (vb) [Seleccionar]
Private Sub Form_Load()
Dim resultado As Long
Dim i As Integer
Dim d1, d2 As Boolean
For i = 1 To 999
d1 = CBool((i / 3) = Int(i / 3))
d2 = CBool((i / 5) = Int(i / 5))
If d1 Or d2 Then
resultado = resultado + i
End If
Next i
MsgBox (resultado)
End Sub



Como Funcion para un Numero dado.

Código (vb) [Seleccionar]
Function mul_3_5(Numero As Long) As Long
Dim resultado As Long
Dim i As Integer
Dim d1, d2 As Boolean
For i = 1 To Numero
d1 = CBool((i / 3) = Int(i / 3))
d2 = CBool((i / 5) = Int(i / 5))
If d1 Or d2 Then
resultado = resultado + i
End If
Next i
mul_3_5 = (resultado)
End Function


saludos

79137913

#2
HOLA!!!

Dany, yo que vos busco sobre optimizacion de codigo.

Código (vb) [Seleccionar]
Private Function mul5and3below1000() As Long
   Dim ct As Long
   Dim aux As Long
   Do
       mul5and3below1000 = mul5and3below1000 + aux + aux2
       ct = ct + 1
       aux = ct + ct + ct
       aux2 = ct + ct + ct + ct + ct
   Loop While aux2 < 1000
   Do
       mul5and3below1000 = mul5and3below1000 + aux
       ct = ct + 1
       aux = ct + ct + ct
   Loop While aux < 1000
   ct = 0
   aux = 0
   Do
       mul5and3below1000 = mul5and3below1000 - aux
       ct = ct + 1
       aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct
   Loop While aux < 1000
End Function


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Danyfirex

Cita de: 79137913 en 23 Enero 2013, 14:17 PM
HOLA!!!
Dany, yo que vos busco sobre optimizacion de codigo.

gracias por el Consejo.

Codigo optimizado:

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


Saludos

79137913

HOLA!!!

Bueno, mejoraste el largo del codigo y un poco la velocidad esta bien, pero mira el mio y tu codigo.

Podras observar que en mi codigo funciona haciendo sumas de los casos positivos dentro de el campo muestral (1-999) y quitando al final las superposiciones mientras que el tuyo lo que hace es analizar una por una todas las probabilidades y extraer de ellas las que cumplen las condiciones. la cantidad de vueltas del primer bucle es de 200 , el segundo 133 y el tercero 66, dando un total de 399 vueltas muchas menos que en tu codigo de 999.

En definitiva tu codigo hace prueba y error, el mio une los 2 grupos de multiplos y quita los repetidos.

P.d: Eso que hago de ct + ct + ct es lo mismo que ct *3 pero es mas rapido para que lo tengas en cuenta.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

$Edu$

Me instalaria el visual basic especialmente para esos retos xD Pero podrias traducirlos y plantear el ejercicio como haces siempre Psyke? asi nadie se confunde traduciendo y terminamos haciendo todos cosas distintas jaja, y ademas de que esta bueno cuando pones como queres la funcion y ejemplos de valores que retornara.

Danyfirex

#6
Cita de: 79137913 en 23 Enero 2013, 16:29 PM
HOLA!!!

Bueno, mejoraste el largo del codigo y un poco la velocidad esta bien, pero mira el mio y tu codigo.

Podras observar que en mi codigo funciona haciendo sumas de los casos positivos dentro de el campo muestral (1-999) y quitando al final las superposiciones mientras que el tuyo lo que hace es analizar una por una todas las probabilidades y extraer de ellas las que cumplen las condiciones. la cantidad de vueltas del primer bucle es de 200 , el segundo 133 y el tercero 66, dando un total de 399 vueltas muchas menos que en tu codigo de 999.

En definitiva tu codigo hace prueba y error, el mio une los 2 grupos de multiplos y quita los repetidos.

P.d: Eso que hago de ct + ct + ct es lo mismo que ct *3 pero es mas rapido para que lo tengas en cuenta.

GRACIAS POR LEER!!!

Claro pero si te fijas en tu código haciendo tantas sumas pierdes velocidad. si te fijas en el tiempo aun mi función con 999 repeticiones es un 30% o 40%  mas rápida que la tuya.

Edito: un 20% o 10%



79137913

#7
HOLA!!!

Eso que me decis me deja atonito...

Hice los testeos y los acabe de realizar nuevamente, tu funcion es aprox 100% mas lenta que la mia ( y siendo generoso 100%), proba con este ejemplo que arme para medir el timing, acordate que se testea compilado.

(borre el codigo por que lo hizo E_C abajo.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Elemental Code

Código (vb) [Seleccionar]
Private Sub Form_Load()
    Form1.Show
    Form1.AutoRedraw = True
    MsgBox "empezara luego del ok"
    t = Timer
    For x = 0 To 100000
        Call mul5and3below1000
    Next
    Form1.Print "tiempo 7913 " & Timer - t
    Form1.Print "resultado 7913 " & mul5and3below1000
    t = Timer
    For x = 0 To 100000
        Call mul_3_5
    Next
    Form1.Print "Tiempo dany " & Timer - t
    Form1.Print "Resultado dani " & mul_3_5
End Sub
Private Function mul5and3below1000() As Long
   Dim ct As Long
   Dim aux As Long
   Do
       mul5and3below1000 = mul5and3below1000 + aux + aux2
       ct = ct + 1
       aux = ct + ct + ct
       aux2 = ct + ct + ct + ct + ct
   Loop While aux2 < 1000
   Do
       mul5and3below1000 = mul5and3below1000 + aux
       ct = ct + 1
       aux = ct + ct + ct
   Loop While aux < 1000
   ct = 0
   aux = 0
   Do
       mul5and3below1000 = mul5and3below1000 - aux
       ct = ct + 1
       aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct
   Loop While aux < 1000
End Function

Function mul_3_5() As Long
Dim i As Integer
For i = 1 To 999
If (i Mod 3) < 1 Or (i Mod 5) < 1 Then
mul_3_5 = mul_3_5 + i
End If
Next i
End Function


Ok, con esta funcion de testeo los resultados mios son:

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

Danyfirex

Cita de: 79137913 en 23 Enero 2013, 17:09 PM
HOLA!!!

Eso que me decis me deja atonito...

Hice los testeos y los acabe de realizar nuevamente, tu funcion es aprox 100% mas lenta que la mia ( y siendo generoso 100%), proba con este ejemplo que arme para medir el timing, acordate que se testea compilado.

(borre el codigo por que lo hizo E_C abajo.

GRACIAS POR LEER!!!

Estabas en lo cierto. bueno no un 100 pero si mucho mas.

la comprobé así.

Código (vb) [Seleccionar]
Dim ct As New CTiming
Private Sub Form_Load()
Form1.Show
MsgBox "empezara luego del ok"
ct.Reset
For x = 1 To 10000
Call mul5and3below1000
Next
Form1.Print "Tiempo 7913 -->" & ct.sElapsed
Form1.Print "Resultado 7913 -->" & mul5and3below1000()
ct.Reset
For x = 1 To 10000
Call mul_3_5
Next
Form1.Print "Tiempo dany -->" & ct.sElapsed
Form1.Print "Resultado dany -->" & mul_3_5()
End Sub


Private Function mul5and3below1000() As Long
   Dim ct As Long
   Dim aux As Long
   Do
       mul5and3below1000 = mul5and3below1000 + aux + aux2
       ct = ct + 1
       aux = ct + ct + ct
       aux2 = ct + ct + ct + ct + ct
   Loop While aux2 < 1000
   Do
       mul5and3below1000 = mul5and3below1000 + aux
       ct = ct + 1
       aux = ct + ct + ct
   Loop While aux < 1000
   ct = 0
   aux = 0
   Do
       mul5and3below1000 = mul5and3below1000 - aux
       ct = ct + 1
       aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct
   Loop While aux < 1000
End Function

Function mul_3_5() As Long
Dim i As Integer
For i = 1 To 999
If (i Mod 3) < 1 Or (i Mod 5) < 1 Then
mul_3_5 = mul_3_5 + i
End If
Next i
End Function


gracias vere si la puedo mejorar.

saludos