2010-04-06 17 views

回答

3

這應該做的工作,最近的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]]] 

Here's有類似的解決方案相關的問題。 「技巧」在方法Array#&中,該方法計算兩個陣列的交集(作爲集合操作)。這是associative操作,所以我們可以將它應用在每個子陣列上,保持累積結果,因此inject是完美的。簡而言之,array.inject(&:&)將帶來array的每個成員中最大的元素子集。 &:&僅僅是一個Ruby速記用於製造Proc了名爲&方法,並利用它作爲一個塊inject,而不是寫:

array.inject{|a,e| a & e} 
+1

@Mladen,Jablonović,這是一個赫然優雅的解決方案。你能稍微更新一下你的答案來解釋一下它是如何工作的。具體來說,'&:&'是什麼,它是如何與'Enumerable#inject'一起工作的? – 2010-04-06 17:59:15