Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => 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:
http://projecteuler.net/problem=2
http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci


La función es correcta si devuelve:
4613732

Estructura a seguir:
Código (vb) [Seleccionar]
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 (vb) [Seleccionar]
Private Function Fibonacci() As Long
Dim a As Long, b As Long, c As Long, x As Long: x = &H4
a = 0
b = 0
c = 0
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:
end Function



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 (vb) [Seleccionar]
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 (vb) [Seleccionar]
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
Cita de: 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 (vb) [Seleccionar]
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 (vb) [Seleccionar]
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 (vb) [Seleccionar]
Private Sub Form_Load()
Dim x, y As Long
x = 4613732
MsgBox (VarType(y) = vbLong)
End Sub


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
CitarSeguro que abarca los bytes de un tipo Variant?

Si  :)

Código (vb) [Seleccionar]
Private Sub Form_Load()
   Dim x, y As Long
   x = 4613732
   y = 4613732
   MsgBox LenB(x) & " bytes"
   MsgBox LenB(y) & " bytes"
End Sub
Título: Re: [RETO] Proyect Euler 2
Publicado por: Danyfirex en 24 Enero 2013, 22:10 PM
Cita de: rob1104 en 24 Enero 2013, 22:03 PM
Si  :)

Código (vb) [Seleccionar]
Private Sub Form_Load()
   Dim x, y As Long
   x = 4613732
   y = 4613732
   MsgBox LenB(x) & " bytes"
   MsgBox LenB(y) & " bytes"
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 (vb) [Seleccionar]
Function robEuler2() As Long
   Dim f1 As Long, f2 As Long, contador As Long, resultado As Long, suma As Long
   f1 = 0
   f2 = 1
   resultado = f1 + f2
   Do While suma < 4000000
       f1 = f2 + resultado
       resultado = f2
       f2 = f1
       contador = contador + 1
       If f2 Mod 2 = 0 Then
           suma = suma + f2
       End If
   Loop
   robEuler2 = suma
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 (vb) [Seleccionar]

Private Static Function Psk1_PE2(Optional lLimit As Long = &H3D0900) As Long
Dim Q1 As Long
Dim Q2 As Long
Dim Q3 As Long
   
    If lLimit And &H80000000 Then Exit Function

   Q1 = &H1
    Q2 = &H1
    Q3 = &H2
   
   Do While Q3 < lLimit
       Psk1_PE2 = Psk1_PE2 + Q3
       
       Q1 = Q2 + Q3
       Q2 = Q1 + Q3
       Q3 = Q2 + Q1
   Loop
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 (vb) [Seleccionar]
Private Function Fibbo7913(Optional Limit As Long = 4000000) As Long
Dim aux  As Long
Dim act  As Long
Dim ant  As Long
Dim suma As Long
    ant = 1
    act = 1
    suma = 1
    Do
        If act And 1 Then suma = suma + act 'operacion binaria que me dice si es par o no
        aux = act
        act = act + ant
        ant = aux
    Loop While act < Limit
    Fibbo7913 = suma
End Function


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 (vb) [Seleccionar]
Private Sub Form_Load()
   Debug.Print Fibbo7913
End Sub


Código (vb) [Seleccionar]

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 (vb) [Seleccionar]
Private Function fb(Optional lLimit As Long = 4000000) As Long
Dim fn As Long, f1 As Long, f2 As Long
If lLimit And &H80000000 Then Exit Function
f1 = 1
f2 = f1
Do While f2 < lLimit
fn = f1 + f2
f1 = f2
f2 = fn
If fn Mod 2 = 0 Then
fb = fb + fn
End If
Loop
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
Cita de: 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

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
Cita de: 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.
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
Cita de: Karcrack en 25 Enero 2013, 15:07 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
Cita de: Karcrack en 25 Enero 2013, 15:07 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 (vb) [Seleccionar]

Option Explicit

'by psyke1
'creditos a karcrack
'25/01/13

Private Static Function Psk_v2(Optional ByVal lLimit As Long = &H3D0900) As Long
Dim q As Long
Dim r As Long
Dim tg As Long
Dim w As Long
Dim Q2 As Long
Dim matriz() As Long
   
   tg = &HDF98
   r = &HA
   For q = 0 To &HF
       r = r + &HA
   Next q
   
   tg = tg Xor r
   r = tg Xor r
   tg = tg Xor r
   
   lLimit = lLimit + &H345
   
   Do While w: w = w - Val(w): Loop
   
   If Not r And &H1 Then
       Psk_v2 = ChrW(&H34) & ChrW(54)
       
       If w = 0 Then
           lLimit = lLimit - &H345
           lLimit = lLimit \ 5
           Psk_v2 = Psk_v2 & CStr(&H35A4)
           
           If ((lLimit * &H5) <> &H3D0900) And Not (&H1 + &H3 = &H5) Then
               Psk_v2 = Psk_v2 - &H29 + &H93
               Do: Beep: DoEvents: DoEvents: Loop
           End If
       Else
           Psk_v2 = (((w And &HFF000000) \ &H1000000) And &HFF&) Or _
               ((w And &HFF0000) \ &H100&) Or _
               ((w And &HFF00&) * &H100&) Or _
               (Val(w And &H7F&) * &H1000000) Xor tg
       End If
   Else
       Q2 = Q2 ^ 5 * Val(Str(9873)) And tg
   End If
End Function


Si hago esto:
Código (vb) [Seleccionar]
Private Sub Form_Load()
   Debug.Print Psk_v2
End Sub


Devuelve esto:
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