Hi Friends,

I have the ff code below. It works but you can see that i have duplicated the "is_odd?" method on both Fixnum and Bignum. I am just asking for something more cleaner/elegant... 

thanks and kind regards -botp

code follows...

:~/ruby # cat test1.rb
#-----------------------------------------------
# http://acm.uva.es/p/v1/100.html
# 3n + 1 problem
#-----------------------------------------------

class Fixnum
    def cycles_3n_1
        n = self
        my_loop do |i|
            break i if n==1
            if n.is_odd?
                n = 3*n + 1
            else
                n = n / 2
            end
        end
    end

    def is_odd?
        self & 1 != 0
    end
end

class Bignum
    def is_odd?
        self & 1 != 0
    end
end

def my_loop
    c = 1
    loop do
        yield c
        c += 1
    end
end

def get_max first, last
    max = -1
    first.upto(last) do |i|
        c = i.cycles_3n_1
        max = c if c>max
    end
    max
end

puts "from \t To \t Max Cycle \t Elapsed Time (sec)"
DATA.each do |pair|
    time_start = Time.now
    i,j = pair.split
    k = get_max i.to_i, j.to_i
    puts "#{i} \t #{j} \t #{k} \t\t #{Time.now-time_start}"
end


__END__
1 10
100 200
201 210
900 1000
1 1_000_000


:~/ruby # ruby test1.rb
from     To      Max Cycle       Elapsed Time (sec)
1        10      20              0.001598
100      200     125             0.073956
201      210     89              0.005831
900      1000    174             0.094012
1        1_000_000       525             1801.349531