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