Все комбинации массива


У меня есть массив

a = ["w1", "w2", "w3"]

Как я могу создать новый массив с каждой комбинацией значений? Мне нужно, чтобы выходные данные выглядели так:

["w1", "w2", "w3", "w1 w1", "w1 w2", "w1 w3", "w2 w1", "w2 w2", "w2 w3", "w3 w1", "w3 w2", "w3 w3", "w1 w1 w1", "w1 w1 w2", "w1 w1 w3", "w1 w2 w1", "w1 w2 w2", "w1 w2 w3", "w2 w1 w1", "w2 w1 w2", "w2 w1 w2", "w2 w1 w3", "w2 w2 w1", "w2 w2 w2", "w2 w2 w3", "w2 w3 w1", "w2 w3 w2", "w2 w3 w3", "w3 w1 w1", "w3 w1 w2", "w3 w1 w3", "w3 w2 w1", "w3 w2 w2", "w3 w2 w3", "w3 w3 w1", "w3 w3 w2", "w3 w3 w2"]

Попробуйте код из сгенерировать массив всех комбинаций существующего массива

Результат неверный

"w1", "w2", "w3", "w1 w2", "w1 w3", "w2 w3", "w1 w2 w3"]
1 2

1 ответ:

Вот один из способов сделать это, однако этот результат имеет "w3 w3 w3", и вы желаемый результат не делает, но я не вижу логики, чтобы включить "w3 w3" и "w1 w1 w1", но не "w3 w3 w3", поэтому я предполагаю, что вы просто пропустили, чтобы добавить это.

То, что вы ищете, - это не комбинации, а перестановки (с повторением):

a = ["w1", "w2", "w3"]

result = (1..a.size).flat_map do |size|
  a.repeated_permutation(size).map { |perm| perm.join(' ') }
end