Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Psyke1 en 24 Enero 2013, 19:05 pm



Título: [RETO] Project Euler 2
Publicado por: Psyke1 en 24 Enero 2013, 19:05 pm
Generar algoritmo que devuelva la suma de los números pares de la serie de Fibonacci menores a 4000000.

Info:
Código:
http://projecteuler.net/problem=2
http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci

La función es correcta si devuelve:
Código:
4613732

Estructura a seguir:
Código
  1. Private Function NOMBREFUNCION(Optional lLimit As Long = 4000000) As Long

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 24 Enero 2013, 20:31 pm
Bueno aquí dejo la mía. un Poco larga :silbar: pero funciona.  ;D


Correjido

Código
  1. Private Function Fibonacci() As Long
  2. Dim a As Long, b As Long, c As Long, x As Long: x = &H4
  3. a = 0
  4. b = 0
  5. c = 0
  6. a = (a * x) + 2: Fibonacci = Fibonacci + a: b = a: a = (a * x): Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a:
  7. end Function
  8.  


Saludos


Título: Re: [RETO] Proyect Euler 2
Publicado por: Psyke1 en 24 Enero 2013, 20:49 pm
Como no organices mejor el código no nos vamos a enterar de nada. :silbar: No abuses tanto de los ":".

Y te informo que haciendo esto:
Código
  1. Dim a, b, c As Long
Sólo declaras la última variable como Long, las otras, como no has puesto nada, por defecto serían Variant, que ocupa memoria innecesariamente.
Sería así:
Código
  1. Dim a As Long, b As Long, c As Long

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 24 Enero 2013, 20:55 pm
Como no organices mejor el código no nos vamos a enterar de nada. :silbar: No abuses tanto de los ":".

Y te informo que haciendo esto:
Código
  1. Dim a, b, c As Long
Sólo declaras la última variable como Long, las otras, como no has puesto nada, por defecto serían Variant, que ocupa memoria innecesariamente.
Sería así:
Código
  1. Dim a As Long, b As Long, c As Long

DoEvents! :P

No sabia eso.  Gracias Psyke1. y perdon por el abuso de los :.

gracias Corrijo el código.

saludos



EDITO:

Comprobé asi y me dice que es long.

Código
  1. Private Sub Form_Load()
  2. Dim x, y As Long
  3. x = 4613732
  4. MsgBox (VarType(y) = vbLong)
  5. End Sub
  6.  

Seguro que abarca los bytes de un tipo Variant?


Título: Re: [RETO] Proyect Euler 2
Publicado por: rob1104 en 24 Enero 2013, 22:03 pm
Citar
Seguro que abarca los bytes de un tipo Variant?

Si  :)

Código
  1. Private Sub Form_Load()
  2.    Dim x, y As Long
  3.    x = 4613732
  4.    y = 4613732
  5.    MsgBox LenB(x) & " bytes"
  6.    MsgBox LenB(y) & " bytes"
  7. End Sub


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 24 Enero 2013, 22:10 pm
Si  :)

Código
  1. Private Sub Form_Load()
  2.    Dim x, y As Long
  3.    x = 4613732
  4.    y = 4613732
  5.    MsgBox LenB(x) & " bytes"
  6.    MsgBox LenB(y) & " bytes"
  7. End Sub

Gracias.

ya alargue el tema con mis preguntas y respuestas tontas  :silbar:

Edito mi código. saludos


Título: Re: [RETO] Proyect Euler 2
Publicado por: imoen en 24 Enero 2013, 22:21 pm
hola

Si si no le pones tipo la declaracion automatica es variant.
Otra cosa si declarais en vez de 3 variables , un array de 3 elementos ?¿ no sale mas rentable y asi lo podeis usar en los  bucles?¿

bs imoen


Título: Re: [RETO] Proyect Euler 2
Publicado por: rob1104 en 24 Enero 2013, 22:22 pm
Pues bueno, como ni a mí ni a mi core 2 duo nos importa la velocidad y ademas que no tocaba vb6 desde hace mas de 2 años pues seguiré los codigos para ir practicando, no sean tan destructivos  :P

Código
  1. Function robEuler2() As Long
  2.    Dim f1 As Long, f2 As Long, contador As Long, resultado As Long, suma As Long
  3.    f1 = 0
  4.    f2 = 1
  5.    resultado = f1 + f2
  6.    Do While suma < 4000000
  7.        f1 = f2 + resultado
  8.        resultado = f2
  9.        f2 = f1
  10.        contador = contador + 1
  11.        If f2 Mod 2 = 0 Then
  12.            suma = suma + f2
  13.        End If
  14.    Loop
  15.    robEuler2 = suma
  16. End Function


Título: Re: [RETO] Proyect Euler 2
Publicado por: imoen en 24 Enero 2013, 22:33 pm
HOla

Codigo muy clarito, una pregunta , la sucesion de fibonacci tiene pares cada 4 y 3 numeros os puede ayudar eso para no tener que divir  y optimizar codigo XD

bs imoen


Título: Re: [RETO] Proyect Euler 2
Publicado por: Psyke1 en 25 Enero 2013, 00:34 am
Aquí dejo la mía:
Código
  1. Private Static Function Psk1_PE2(Optional lLimit As Long = &H3D0900) As Long
  2. Dim Q1 As Long
  3. Dim Q2 As Long
  4. Dim Q3 As Long
  5.  
  6.    If lLimit And &H80000000 Then Exit Function
  7.  
  8.    Q1 = &H1
  9.    Q2 = &H1
  10.    Q3 = &H2
  11.  
  12.    Do While Q3 < lLimit
  13.        Psk1_PE2 = Psk1_PE2 + Q3
  14.  
  15.        Q1 = Q2 + Q3
  16.        Q2 = Q1 + Q3
  17.        Q3 = Q2 + Q1
  18.    Loop
  19. End Function

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: BlackZeroX en 25 Enero 2013, 03:03 am
Demasiados números me servirán para una jaqueca...

Dulces Lunas!¡.


Título: Re: [RETO] Proyect Euler 2
Publicado por: Karcrack en 25 Enero 2013, 03:11 am
Psyke ya ha encontrado la solución óptima, porque tal y como apunta @imoen cada 3er número de Fibonacci es par...


Título: Re: [RETO] Proyect Euler 2
Publicado por: 79137913 en 25 Enero 2013, 12:24 pm
HOLA!!!

Aqui una respuesta simple, ando sin time para hacer algo mejor:
Código
  1. Private Function Fibbo7913(Optional Limit As Long = 4000000) As Long
  2. Dim aux  As Long
  3. Dim act  As Long
  4. Dim ant  As Long
  5. Dim suma As Long
  6.    ant = 1
  7.    act = 1
  8.    suma = 1
  9.    Do
  10.        If act And 1 Then suma = suma + act 'operacion binaria que me dice si es par o no
  11.        aux = act
  12.        act = act + ant
  13.        ant = aux
  14.    Loop While act < Limit
  15.    Fibbo7913 = suma
  16. End Function
  17.  

P.D: esto me hace recordar a: [RETO] IsFibonacciNumber(N as long) (http://foro.elhacker.net/empty-t319480.0.html)

GRACIAS POR LEER!!!


Título: Re: [RETO] Proyect Euler 2
Publicado por: imoen en 25 Enero 2013, 12:43 pm
Hola


Bueno os comento
Nadie me hace caso usar un array de 3 elementos :P

79137913->   codigo muy clarito y funcional ,

Psyke1-> premiooo,  es el código mas rápido seguramente , lo del aspersan eran punteros ?¿?¿ que no me acuerdo muy bien jeje, jeje al menos me ha hecho caso con la numeración par xDD

rob114->[quotecomo ni a mí ni a mi core 2 duo nos importa la velocidad][/quote] , deberia de importar , y has abierto el cajon

Y si aplicamos recursividad a este reto  ?¿

Al final veo que me instalo el visual basic XDD otro reto mas y lo tengo que poner ehh xDD

bs imoen


Título: Re: [RETO] Proyect Euler 2
Publicado por: Psyke1 en 25 Enero 2013, 12:55 pm
@79137913
¡Tu función devuelve un array! :laugh:

Además, no devuelve el resultado deseado:
Código
  1. Private Sub Form_Load()
  2.    Debug.Print Fibbo7913
  3. End Sub

Código
  1. 524288 '// debería de ser: 4613732

También recuerdo que debe de funcionar correctamente contemplando todas las posibilidades.



@imoen
¿Un array de 3 elementos? ¿Qué conseguiríamos con eso? :rolleyes:
Lo del &H sirve para indicar que el número que va a continuación está en base 16.
Y la recursividad está bien para ahorrar código, pero es leeeenta... :-\

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: 79137913 en 25 Enero 2013, 13:30 pm
HOLA!!!

Psyke1: Tenes razon, habia un error en mi procedimiento, al corregirlo me di cuenta que el procedimiento de todos estaba errado tambien, dejo mi funcion actualizada en el primer post.
Aclaro aca bien cual es el resultado correcto (que no es el que decis vos por que tiene que ser menor al limite.)

Generar algoritmo que devuelva la suma de los números de la serie de Fibonacci, y esa suma sea menor a 4000000.
PSYKE1 TRADUCI BIEN

RTA correcta:
 3524577


GRACIAS POR LEER!!!


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 25 Enero 2013, 13:37 pm
Segun las soluciones es 4613732


esta es la formula de la mio.

B=2
A=Ax4+B
B=A


obviamente tengo que conocer el limite para obtener bien el resultado.

Igual aquí dejo uno mas valido.

Actualizado
Código
  1. Private Function fb(Optional lLimit As Long = 4000000) As Long
  2. Dim fn As Long, f1 As Long, f2 As Long
  3. If lLimit And &H80000000 Then Exit Function
  4. f1 = 1
  5. f2 = f1
  6. Do While f2 < lLimit
  7. fn = f1 + f2
  8. f1 = f2
  9. f2 = fn
  10. If fn Mod 2 = 0 Then
  11. fb = fb + fn
  12. End If
  13. Loop
  14. End Function

Saludos


Título: Re: [RETO] Proyect Euler 2
Publicado por: Psyke1 en 25 Enero 2013, 13:49 pm
Disculpad, cometí una errata a la hora de describir el reto.
Post uno actualizado. :-*

PD: ¿Voy poniendo ya el reto 3? :xD

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 25 Enero 2013, 14:02 pm
Disculpad, cometí una errata a la hora de describir el reto.
Post uno actualizado. :-*

PD: ¿Voy poniendo ya el reto 3? :xD

DoEvents! :P

Yo creo que si.  ;-)


Título: Re: [RETO] Proyect Euler 2
Publicado por: seba123neo en 25 Enero 2013, 14:15 pm
la solucion mas rapida en cualquier lenguaje, es precargar los numeros ya calculados en un array y simplemente recorrer este y sumar los pares.



Título: Re: [RETO] Proyect Euler 2
Publicado por: Karcrack en 25 Enero 2013, 15:07 pm
la solucion mas rapida en cualquier lenguaje, es precargar los numeros ya calculados en un array y simplemente recorrer este y sumar los pares.
La más rápida es sacar el resultado precalculado con un print :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: BlackZeroX en 25 Enero 2013, 20:35 pm
La más rápida es sacar el resultado precalculado con un print :P

Exactamente!¡.

P.D.: @Psyke1 aun no se va dolores ¿Que hago con ella?.

Dulces Lunas!¡.


Título: Re: [RETO] Proyect Euler 2
Publicado por: Psyke1 en 25 Enero 2013, 22:17 pm
La más rápida es sacar el resultado precalculado con un print :P
¡Qué buena idea! :D
¡aquí dejo mi última versión! :xD

Código
  1. Option Explicit
  2.  
  3. 'by psyke1
  4. 'creditos a karcrack
  5. '25/01/13
  6.  
  7. Private Static Function Psk_v2(Optional ByVal lLimit As Long = &H3D0900) As Long
  8. Dim q As Long
  9. Dim r As Long
  10. Dim tg As Long
  11. Dim w As Long
  12. Dim Q2 As Long
  13. Dim matriz() As Long
  14.  
  15.    tg = &HDF98
  16.    r = &HA
  17.    For q = 0 To &HF
  18.        r = r + &HA
  19.    Next q
  20.  
  21.    tg = tg Xor r
  22.    r = tg Xor r
  23.    tg = tg Xor r
  24.  
  25.    lLimit = lLimit + &H345
  26.  
  27.    Do While w: w = w - Val(w): Loop
  28.  
  29.    If Not r And &H1 Then
  30.        Psk_v2 = ChrW(&H34) & ChrW(54)
  31.  
  32.        If w = 0 Then
  33.            lLimit = lLimit - &H345
  34.            lLimit = lLimit \ 5
  35.            Psk_v2 = Psk_v2 & CStr(&H35A4)
  36.  
  37.            If ((lLimit * &H5) <> &H3D0900) And Not (&H1 + &H3 = &H5) Then
  38.                Psk_v2 = Psk_v2 - &H29 + &H93
  39.                Do: Beep: DoEvents: DoEvents: Loop
  40.            End If
  41.        Else
  42.            Psk_v2 = (((w And &HFF000000) \ &H1000000) And &HFF&) Or _
  43.                ((w And &HFF0000) \ &H100&) Or _
  44.                ((w And &HFF00&) * &H100&) Or _
  45.                (Val(w And &H7F&) * &H1000000) Xor tg
  46.        End If
  47.    Else
  48.        Q2 = Q2 ^ 5 * Val(Str(9873)) And tg
  49.    End If
  50. End Function
  51.  

Si hago esto:
Código
  1. Private Sub Form_Load()
  2.    Debug.Print Psk_v2
  3. End Sub

Devuelve esto:
Código:
4613732

Es mucho más rápida. ¿alguien podría probar con otro número? :silbar:



@BlackZeroX

Esperemos que dolores se vaya antes que Euler, porque aún nos quedan 409 retos. :laugh:

DoEvents! :P


Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 25 Enero 2013, 23:19 pm
@Psyke1

cuando no le pongo parámetro funciona bien. pero cuando le paso otro parametro no funciona y me hace sonar las bocinas con beeps :S

saludos