From: Junji Sawada Date: 2007-10-28T09:53:41+09:00 Subject: [ruby-list:44148] Re: 2個づつの組を作る方法のすべて さわだと申します。 2*n、ていうかn個の集合から二個ずつ取るとnC2組だと思うのですが、 こんな感じでしょうか? #-------- #!/usr/bin/env ruby def make_combination(array) result = [] (0...(array.length-1)).each do |i| ((i+1)...array.length).each do |j| result << [array[i], array[j]] end end result end if $0 == __FILE__ then a = [1, 2, 3, 4] p make_combination(a) => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] b = [1, 2, 3, 1] p make_combination(b) => [[1, 2], [1, 3], [1, 1], [2, 3], [2, 1], [3, 1]] end #-------- 小原さんスクリプトのうまくいかないパターンだと、 g=[1,2]となった場合に、 a(=[1,2,3,1])-g(=[1,2])=>[3] となってうまくいかない、つまり集合に同じ物があると うまくいきません。 > 小原と申します。御世話になっています。 > > 2*n 個の集合から、二個づつを取って n 個の組を作る全て > の作りかたを、列挙する script が分からなくて少し > 困っています。例えばこんなやつです。 > > [1,2,3,4] => [[[1,2],[3,4]],[1,3][2,4],[1,4],[2,3]]] > > 以下は、苦し紛れに作ったものですが、変な動きをする > 場合があります。 > 幼稚な質問かもしれませんが、どなたか御指導下さい。 > > #-----------------------------------------# > #!/usr/bin/env ruby > > # サイズ 2*n の配列 a から > # 2個の要素の組をn個作る方法は > # (2n-1)*(2n-3)*....*3*1 通りある。(?) > # その全てを列挙する > > def f(a) # 平滑化した配列 > n=a.size/2 > gg=[];hh=[] > if n==1 > hh=[[a[0],a[1]]] > else > i=1 > while i<2*n > g=[a[0],a[i]];gg.push(g) > i+=1 > end > h=[] > gg.each{|g|;ff=f(a-g);next if ff==[] > ff.each{|x|;h=g+x;hh.push(h)} > } > hh > end > end > > def fa(a) # 2個づつの組にした配列の配列 > b=f(a);bb=[] > b.each{|x| > i=0;j=0;y=[] > while x[i] > y[j]=[x[i],x[i+1]];i+=2;j+=1 > end > bb.push(y) > } > bb > end > > #------------------------------------------------------# > > a=[1,2,3,4] > fa(a)=>[[[1,2],[3,4]],[[1,3],[2,4]],[[1,4],[2,3]]] > b=[1,2,3,1] > fa(b)=>[[[1, 1], [2, 3]]] > > 以上、よろしくお願いします。