多次元配列があります:
a=[[2,3,4],[1,3,4],[1,2],[1,2,3,4]]
4つのサブ配列すべてを比較して共通の要素を取得する必要があります。次に、一度に3つのサブ配列を取得して共通の要素を取得します。次に、RUBYで一度に2つのサブ配列を取得して共通の要素を取得します。
多次元配列があります:
a=[[2,3,4],[1,3,4],[1,2],[1,2,3,4]]
4つのサブ配列すべてを比較して共通の要素を取得する必要があります。次に、一度に3つのサブ配列を取得して共通の要素を取得します。次に、RUBYで一度に2つのサブ配列を取得して共通の要素を取得します。
最近のRubyバージョンでは、これでうまくいくはずです:
a.length.downto(1).map{|i| a.combination(i).map{|sub| sub.inject(&:&)}}
#=> [[[]], [[], [3, 4], [2], [1]], [[3, 4], [2], [2, 3, 4], [1], [1, 3, 4], [1, 2]], [[2, 3, 4], [1, 3, 4], [1, 2], [1, 2, 3, 4]]]
これは、同様の解決策を持つ関連する質問です。「トリック」は methodArray#&
にあります。これは、2 つの配列の交差を (集合操作として) 計算します。これは連想操作であるため、累積結果を保持しながら各サブアレイに順番に適用できるため、inject
最適です。つまり、array.inject(&:&)
のすべてのメンバーの要素の最大共通サブセットが得られarray
ます。次のように書く代わりに、という名前のメソッドを作成し、それをブロックとして に送信する&:&
ための Ruby の省略形です。Proc
&
inject
array.inject{|a,e| a & e}