たけ(tk)です。

こんなのも思いついた。

class Array

@@combi_indicies_hash = {}
def combi_indicies(s,n)
#p [s,n,@@combi_indicies_hash[[s,n]]]
  return [] if (n < 1) || (n > s)
  case n
  when 1 ; return  Array.new(s){|i|[i]}
  when s ; return [Array.new(s){|i| i }]
  else
    return @@combi_indicies_hash[[s,n]] ||= (combi_indicies(s-1,n)+combi_indicies(s-1,n-1).collect{|a| a+[s-1]}).sort
  end
end

def combinationN(n)
  combi_indicies(self.size,n).collect{|a| self.values_at(*a)}
end
end

p [:r,:u,:b,:y].combinationN(0) #=> []
p [:r,:u,:b,:y].combinationN(1) #=> [[:r], [:u], [:b], [:y]]
p [:r,:u,:b,:y].combinationN(2) #=> [[:r, :u], [:r, :b], [:u, :b], [:r, :y], [:u, :y], [:b, :y]]
p [:r,:u,:b,:y].combinationN(3) #=> [[:r, :u, :b], [:r, :u, :y], [:r, :b, :y], [:u, :b, :y]]
p [:r,:u,:b,:y].combinationN(4) #=> [[:r, :u, :b, :y]]
p [:r,:u,:b,:y].combinationN(5) #=> []
p [:r,:u,:b,:y].combinationN(6) #=> []

p [11,22,33,44,55,66,77,88,99].combinationN(5) #=> []


take_tk = kumagai hidetake