Hi, first post to clr here.

I have a guess a haskell bias as that’s the last language I learned,

and now I’m learning ruby.

I was trying to solve project euler problem 2 as an exercise. This is,

sum all the even fibonacci numbers less than 4 million.

There is a solution that works at

http://www.absorbeo.net/2008/01/10/project-euler-problem-2/

however I didn’t quite like it because the test for evenness is in the

fold (haskell speak for inject).

puts a.inject(0) {|s,v|

if v > 1_000_000 then

break s

elsif v % 2 == 0

s+v

else

s

end

}

the haskell solution reads nicer to me

t = ( putStrLn . show . sum . takeWhile (<=4000000) . filter even )

fibs2

fibs2 = 1 : 2 : zipWith (+) fibs2 (tail fibs2)

but it relies on laziness and who knows what other magic.

I decided to see if I could find a ruby solution that was more

haskellish. It turns I can… almost.

There is a ruby library for laziness

# http://lazylist.rubyforge.org/

and it would seem to do what I want. But it hangs for some reason.

I have poor sense of ruby culture. Should I report this as a bug? Is

it even a bug? Do people ever use laziness, or is this crazy

experimentation?

Thanks for help and advice!

Code below:

[email protected]:~/thomashartman-learning/ruby/katas/euler>cat

2.rb

require ‘rubygems’

require ‘lazylist’ # http://lazylist.rubyforge.org/

# Solve Project Euler problem 2: sum fibonacci numbers <= 4_000_000,

which are even.

fibs = ( LazyList.tabulate(0) { |x| x < 2 ? 1 : fibs[x-2] +

fibs[x-1] } )

fibsUnder4M = ( fibs.partition{ |x| x <= 4_000_000 })[0]

evenFibsUnder4M = fibsUnder4M.select{ |x| x %2 == 0}

# problem seems to be with partition

# evenFibsLessThanFourMil = ( evenFibs.partition{ |x| x <= 4_000_000 })

[0]

# works

# puts evenFibsLessThanFourMil.take(1)

# hangs

puts evenFibsUnder4M.take(10) # this is ok

puts evenFibsUnder4M.take(11) # this hangs, laptop gets hot, fan turns

on…

# exit

# this would be the answer to the euler problem, if only there wasn’t

the bug…

result = evenFibsLessThanFourMil.inject(0){ | accum,val | accum + val}

main = puts result

[email protected]:~/thomashartman-learning/ruby/katas/

euler>ruby 2.rb

2

8

34

144

610

2584

10946

46368

196418

832040

… hung…