Вот очень компактное и быстрое решение:
def conflict(a)
a.combination(2).to_a << a
end
>> [["a", "b"], ["a", "c"], ["b", "c"], ["a", "b", "c"]]
Если вы действительно хотели, чтобы начальный массив был в начале, вы жертвовали немалой скоростью. Тем не менее, лучший способ сделать это:
def conflict(a)
temp = [a]
a.combination(2).each { |com| temp << com}
temp
end
>> [["a", "b", "c"], ["a", "b"], ["a", "c"], ["b", "c"]]
Если вход не равен 3, это будет работать:
def conflict(a)
temp = []
2.upto(a.size-1) {|i| temp += a.combination(i).to_a}
temp << a
end
Исходный массив может быть добавлен в начале или конце. Выше это в конце.