ruby-listで…

ruby-listでこんなメールがあった。(ここで見れる。)

2*n 個の集合から、二個づつを取って n 個の組を作る全て
の作りかたを、列挙する script が分からなくて少し
困っています。例えばこんなやつです。

 [1,2,3,4] => [[[1,2],[3,4]],[1,3][2,4],[1,4],[2,3]]]

自分なりの回答を思いついたけど、日付が古い*1ので日記に書くだけにする。以下は自分の回答

def f(a)
  result=[]
  ls=[]; rs=[]; flag=true
  which = proc{|flag,ls,rs| (flag)? ls : rs}

  a.each_with_index do |e,i|
    a[i+1..-1].each {|ele| result << [e, ele]}
  end

  result.each do |e|
    which.call(flag,ls,rs) << e
    flag = !flag
  end
  ls.zip(rs.reverse!)
end
p f((1..4).to_a)
#=>[[[1, 2], [3, 4]], [[1, 4], [2, 3]], [[2, 4], [1, 3]]]

追記

囲碁の対局表のようなものを作りたかったみたい。
だとしたら、さっき作った関数に6までの配列を渡したときに、

[[2, 4], [2, 5]]

とかになるので、ダメなみたい。

*1:Date: Sun, 28 Oct 2007 01:52:14 +0900