Archive

Posts Tagged ‘euler project’

Problem 3

October 12th, 2008 Serabe No comments

Wording: (Original) The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?

Solution:
First the code:
[ruby]
include Math
def prime_factors(num, factor=2)
return [] if num <= 1
next_pf = (factor..(sqrt(num).ceil)).find(lambda {num}){ |x| num%x == 0 }
return [next_pf] + prime_factors(num/next_pf, next_pf)
end

puts prime_factors(600851475143).max
[/ruby]

The code is a direct port from the one in PyEuler. It is based mainly in the idea that the first factor of a number is always prime.

Line 3 breaks recursion and line 4 works out the next prime factor (actually, it finds the smallest factor). For doing this, it uses find method. If no element match the criteria, then it returns the number (that is what the lambda block is for).

Finally, line 5 merges the results and line 8 print the result.

This time just one code is showed.

article clipper Problem 3
 
share save 171 16 Problem 3

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]
def fib1(max,arr=[1,1])
while(arr.last < max) do
arr << (arr.last+arr[arr.size-2])
end
arr.pop
arr
end[/ruby]

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

[ruby]
def euler2a(max, ini=[1,1])
fib1(max,ini).delete_if{|x| x%2 == 1}.inject{|memo,obj| memo+obj}
end

puts euler2a(4e6)[/ruby]

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]
def fib2(max,a=1,b=1)
arr = []
arr << a if yield(a)
while(b arr << b if yield(b)
a,b=b,a+b
end
arr
end[/ruby]

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

[ruby]
def euler2b(max,a=1,b=1)
fib2(max,a,b){|x| x%2==0}.inject{|memo,obj| memo+obj}
end

puts euler2b(4e6)[/ruby]

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]
def fib3(max,a=1,b=1)
res = 0
res += a if yield(a)
while(b res += b if yield(b)
a,b=b,a+b
end
res
end

def euler2c(max,a=1,b=1)
fib3(max,a,b){|x| x%2==0}
end

puts euler2c(4e6)
[/ruby]

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