Archive

Archive for March 23rd, 2008

Tweets del 23-03-2008

March 23rd, 2008 Serabe No comments
article clipper Tweets del 23 03 2008
 
share save 171 16 Tweets del 23 03 2008

Problema 2

March 23rd, 2008 Serabe No comments

Enunciado:
Suma todos los números pares de la sucesión de Fibonacci menores que un cuatro millón.

Primera solución:

La primera solución es muy simple. Hay un método que devuelve un array con todos los números de la sucesión de Fibonacci menores que un máximo max tomando como inicio un array de dos elementos arr.

RUBY:
  1. def fib1(max,arr=[1,1])
  2.   while(arr.last <max) do
  3.     arr <<(arr.last+arr[arr.size-2])
  4.   end
  5.   arr.pop
  6.   arr
  7. end

Después simplemente se eliminan los impares y se suman los que quedan.

RUBY:
  1. def euler2a(max, ini=[1,1])
  2.   fib1(max,ini).delete_if{|x| x%2 == 1}.inject{|memo,obj| memo+obj}
  3. end
  4.  
  5. puts euler2a(4e6)

Segunda solución:

Esta solución es un poco mejor. Se va a hacer un nuevo método que calcule todos los números de la sucesión de Fibonacci menores que un máximo max pero que sólo almacene aquellos que pasen una condición que se le pasa como bloque:

RUBY:
  1. def fib2(max,a=1,b=1)
  2.   arr = []
  3.   arr <<a if yield(a)
  4.   while(b<max) do
  5.     arr <<b if yield(b)
  6.     a,b=b,a+b
  7.   end
  8.   arr
  9. end

Después sólo hace falta pasar el filtro adecuado, y sumar los resultados:

RUBY:
  1. def euler2b(max,a=1,b=1)
  2.   fib2(max,a,b){|x| x%2==0}.inject{|memo,obj| memo+obj}
  3. end
  4.  
  5. puts euler2b(4e6)

Tercera solución:

Esta tercera solución es una modificación directa de la segunda. En vez de almacenar los datos, se suman directamente.

RUBY:
  1. def fib3(max,a=1,b=1)
  2.   res = 0
  3.   res += a if yield(a)
  4.   while(b<max) do
  5.     res += b if yield(b)
  6.     a,b=b,a+b
  7.   end
  8.   res
  9. end
  10.  
  11. def euler2c(max,a=1,b=1)
  12.   fib3(max,a,b){|x| x%2==0}
  13. end
  14.  
  15. puts euler2c(4e6)

Y eso es todo.

Actualización: Hay diferencias entre la página de PyEuler y la del Proyecto Euler. El problema ha sido actualizado para corresponderse con esta última.

article clipper Problema 2
 
share save 171 16 Problema 2

Punto G

March 23rd, 2008 Serabe 1 comment

¿Usted sabía algo de esto?

0 Punto G
article clipper Punto G
 
share save 171 16 Punto G
Improve the web with Nofollow Reciprocity.