原です。

> こんにちは。ささだです。
>
>  [ [ruby-math:00851] Ramanujan Number ]
>  Mon, 12 May 2003 10:19:05 +0900 への返信です。
>
> はじめて投稿させていただきます。

初めてだったんですかあ。

>def sumcube e
>  e[0]**3+e[1]**3
>end
>
>def taxi_nums n
>  b = yield ; found = 0
>  while found < n
>    a = yield
>    #puts "#{a.inspect} => #{sumcube a}"
>    if a[0] == b[0]
>      a,b = b,a if a[1][0] > b[1][0]
>      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
>      found += 1
>    end
>    b = a
>  end
>end
>
>queue = [[9,[1,2]]]
>
>taxi_nums(30){
>  r = queue.shift
>  a = r[1][0]
>  b = r[1][1]
>  c = [a,b+1]
>  queue << [sumcube(c),c]
>  if a+2 == b
>    c = [a+1,b]
>    queue << [sumcube(c),c]
>  end
>  
>  queue.sort!{|a,b|
>    a[0] <=> b[0]
>  }
>  r
>}

実は私の最初に用意していた解答は、これとそっくりでただソート
を自前でやったものでした。一応書いておきます。

def fsort(a)
  n = a.size
  v = a[0][2]
  i = 1
  i += 1 while i < n && a[i][2] < v
  if i > 1
    a[i, 0] = [a[0]]
    a.shift
  end
end

def ramanujan(f)
  prev = nil
  axis = [0, 0, 0]

  while true
    first = axis[0]
    if prev &&  prev[2] == first[2]
      yield [prev[2], prev[0, 2], first[0, 2]]
    end
    prev = first.dup
    first[1] += 1
    first[2] = f[first[0], first[1]]
    fsort(axis)
    n = axis.size
    if first[1] == n + 2
      axis.push [n, n, f[n, n]]
      fsort(axis)
    end
  end
end

i = 0
ramanujan(proc{|x, y| x**3 + y**3}) do |v, x, y|
  i += 1
  puts("%d = %d**3 + %d**3 = %d**3 + %d**3" % [v, x[0], x[1], y[0], y[1]])
  break if i == 100
end


> 速くするために、児玉さんの priority queue for Ruby.
>(http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html) を利用したバージョン。
>----------------------------------------------------------------------
>def sumcube e
>  e[0]**3+e[1]**3
>end
>
>def taxi_nums n
>  b = yield ; found = 0
>  while found < n
>    a = yield
>    #puts "#{a.inspect} => #{sumcube a}"
>    if a[0] == b[0]
>      a,b = b,a if a[1][0] > b[1][0]
>      puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}"
>      found += 1
>    end
>    b = a
>  end
>end
>
># http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html
>require 'pqueue'
>queue = PQueue.new lambda{|x,y|
>  x[0] < y[0]
>}
>queue.push [9,[1,2]]
>
>taxi_nums(30){
>  r = queue.pop
>  a = r[1][0]
>  b = r[1][1]
>  c = [a,b+1]
>  queue.push [sumcube(c),c]
>  if a+2 == b
>    c = [a+1,b]
>    queue.push [sumcube(c),c]
>  end
>  r
>}

これは大分速くなりますね。pqueue.rb の使い方を初めて知りました。
(^^;

priority queue がこんなに威力があるとは思いませんでした。これっ
てヒープ構造を使っているんですね。