Sha256: c4106e8494b49147d9f5e528a7787ad2c702fd5800871b8d32b0323d79743e21
Contents?: true
Size: 1.13 KB
Versions: 6
Compression:
Stored size: 1.13 KB
Contents
class Array unless method_defined?(:combination) # 1.8.7+ require 'facets/enumerator' # Yields the block to each unique combination of _n_ elements. # # a = %w|a b c d| # a.combination(3) # # produces # # [["a", "b", "c"], # ["a", "b", "d"], # ["a", "c", "d"], # ["b", "c", "d"]] # # CREDIT: Florian Gross def combination(k=2) if block_given? s = to_a n = s.size return unless (1..n) === k idx = (0...k).to_a loop do yield s.values_at(*idx) i = k - 1 i -= 1 while idx[i] == n - k + i break if i < 0 idx[i] += 1 (i + 1 ... k).each {|j| idx[j] = idx[i] + j - i} end else to_enum(:combination, k) end end # OLD WAY #a = [] #s = self #n = s.size #return unless (1..n) === k #dx = (0...k).to_a #loop do # a << s.values_at(*idx) # i = k - 1 # i -= 1 while idx[i] == n - k + i # break if i < 0 # idx[i] += 1 # (i + 1 ... k).each {|j| idx[j] = idx[i] + j - i} #end #a end end
Version data entries
6 entries across 6 versions & 1 rubygems