From: Linus Sellberg Date: 2004-05-14T18:13:59+09:00 Subject: Re: How to make combinations of an array to produce all possible expressions? > module Enumerable > def each_subset(skip_empty = false) > enum = respond_to?( :size ) ? self : to_a > > for n in (skip_empty ? 1 : 0) ... (1 << enum.size) do > subset = [] > > enum.each_with_index do |elem, i| > subset << elem if n[i] == 1 > end > > yield subset > end > > self > end > > def powerset(skip_empty = false) > subsets = [] > > each_subset(skip_empty) { |s| subsets << s } > > return subsets > end irb(main):013:0> def powerset( x ) irb(main):014:1> x.inject([[]]) {|m, n| m.map {|b| [n] + b} + m } irb(main):015:1> end irb(main):017:0> a = [1,2,3] => [1, 2, 3] irb(main):018:0> powerset a => [[3, 2, 1], [3, 2], [3, 1], [3], [2, 1], [2], [1], []] irb(main):019:0> Only works for arrays, but it might be possible to generalize it?