Aaron Yodaiken - 1 year ago 82
Ruby Question

# more ruby way of doing project euler #2

I'm trying to learn Ruby, and am going through some of the Project Euler problems. I solved problem number two as such:

``````def fib(n)
return n if n < 2
vals = [0, 1]
n.times do
vals.push(vals[-1]+vals[-2])
end
return vals.last
end
i = 1
s = 0
while((v = fib(i)) < 4_000_000)
s+=v if v%2==0
i+=1
end
puts s
``````

While that works, it seems not very ruby-ishâ€”I couldn't come up with any good purely Ruby answer like I could with the first one (
`puts (0..999).inject{ |sum, n| n%3==0||n%5==0 ? sum : sum+n }`
).

For a nice solution, why don't you create a Fibonacci number generator, like `Prime` or the `Triangular` example I gave here.

From this, you can use the nice `Enumerable` methods to handle the problem. You might want to wonder if there is any pattern to the even Fibonacci numbers too.

Note: there are more efficient ways than enumerating them, but they require more math, won't be as clear as this and would only shine if the 4 million was much higher.

As demas' has posted a solution, here's a cleaned up version:

``````class Fibo
class << self
include Enumerable

def each
a = 0; b = 1
loop do
a, b = b, a + b
yield a
end
end
end
end

puts Fibo.take_while { |i| i < 4000000 }.
select(&:even?).
inject(:+)
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download