<?xml version="1.0" encoding="UTF-8"?>
<code>
  <code>require 'benchmark' 

def euler_chain_size(start)
  length = 0 
  while start &gt; 1 
    start = start%2 == 0 ? start/2 : 3*start+1 
    length += 1 
    if @chains.has_key?(start) 
      length += @chains[start] 
      break 
    end 
  end 
  length 
end 

@chains = {} 
max_chain_size = 0 
max_chain_start = 1 

Benchmark.bm do |x| 
  x.report do 
    1.upto(1000000) do |i| 
      chain_size = euler_chain_size(i) 
      @chains[i] = chain_size 
      if chain_size &gt; max_chain_size 
        max_chain_size = chain_size 
        max_chain_start = i 
      end 
    end 
  end 
  puts "(#{max_chain_start}, #{max_chain_size})" 
end 

</code>
  <comment>The problem description is here: http://projecteuler.net/index.php?section=problems&amp;id=14

My interest was sparked by: http://diditwith.net/2008/04/03/ApplesAndOranges.aspx</comment>
  <created-at type="datetime">2008-04-04T00:30:49+00:00</created-at>
  <id type="integer">276</id>
  <language>Ruby</language>
  <permalink>euler-14</permalink>
  <refactors-count type="integer">2</refactors-count>
  <title>Euler 14</title>
  <trackback-url></trackback-url>
  <updated-at type="datetime">2008-07-24T07:50:30+00:00</updated-at>
  <user-id type="integer">541</user-id>
  <refactors type="array">
    <refactor>
      <code>require 'benchmark' 

def operation(n)
  return n%2 == 0 ? n/2 : 3*n+1 
end

def recursive(hash, n)
  hash[n] or hash[n] = 1 + recursive(hash, operation(n) )
end

chains = {} 
max_chain_size = 0 
max_chain_start = 1 

Benchmark.bm do |x| 
  x.report do 
    chains[1] = 1
    2.upto(1000000) do |i| 
      chain_size = recursive(chains, i)
      
      if chain_size &gt; max_chain_size 
        max_chain_size = chain_size 
        max_chain_start = i 
      end 
    end 
  end 
  puts "(#{max_chain_start}, #{max_chain_size})" 
end 
</code>
      <code-id type="integer">276</code-id>
      <comment>slightly faster, caches more data</comment>
      <created-at type="datetime">2008-04-06T00:19:24+00:00</created-at>
      <id type="integer">4714</id>
      <language>Ruby</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Euler 14</title>
      <user-id type="integer">535</user-id>
      <user-name>jes5199</user-name>
      <user-website>http://jes5199.com</user-website>
    </refactor>
    <refactor>
      <code>array = []
 
(1..1_000_000).each do |x|
  sum = 0
  while x != 1
    sum += 1
    if x % 2 == 0
      x = x / 2
    else
      x = (3 * x) + 1
    end
  end
  array &lt;&lt; sum
end
 
puts array.index(array.max) + 1</code>
      <code-id type="integer">276</code-id>
      <comment>From the euler forums</comment>
      <created-at type="datetime">2008-07-24T07:50:25+00:00</created-at>
      <id type="integer">13708</id>
      <language>Ruby</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Euler 14</title>
      <user-id type="integer">865</user-id>
      <user-name>tyranarchy.myopenid.com</user-name>
      <user-website nil="true"></user-website>
    </refactor>
  </refactors>
</code>
