From: takkanm@... Date: 2007-10-28T10:44:19+09:00 Subject: [ruby-list:44151] Re: 2個づつの組を作る方法のすべて ミムラといいます。 さわださんと同じ方針ですが、 each_with_indexとarray[array.length -1] == array[-1]を利用すれば、すっきりかけます。 irb(main):026:0> a = [1,2,3,4] => [1, 2, 3, 4] irb(main):027:0> ret = [];a.each_with_index{|b,i| a[(i+1)..(-1)].each{|c| ret << [b,c] }} => [1, 2, 3, 4] irb(main):028:0> ret => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] irb(main):029:0> a = [1,2,3,1] => [1, 2, 3, 1] irb(main):030:0> ret = [];a.each_with_index{|b,i| a[(i+1)..(-1)].each{|c| ret << [b,c] }} => [1, 2, 3, 1] irb(main):031:0> ret => [[1, 2], [1, 3], [1, 1], [2, 3], [2, 1], [3, 1]] 07/10/28 に Junji Sawada さんは書きました: > さわだと申します。 > > 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]]] > > > > 以上、よろしくお願いします。 > > >