Method: Array#each_combination
- Defined in:
- lib/nano/enumerable/each_combination.rb
#each_combination(k = 2) ⇒ Object
Yields the block to each unique combination of n elements.
a = %w|a b c d|
a.each_combination(3) do |c|
p c
end
produces
["a", "b", "c"]
["a", "b", "d"]
["a", "c", "d"]
["b", "c", "d"]
18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/nano/enumerable/each_combination.rb', line 18 def each_combination(k=2) s = self.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 end |