Ruby - как получить ВСЕ комбинации элементов массива - PullRequest
0 голосов
/ 26 мая 2019

Если у меня есть массив:

%w(a b c d e)
=> ["a","b","c","d","e"]

Я могу получить несколько комбинаций с

irb(main):071:0> %w(a b c d e).combination(3).to_a
=> [["a", "b", "c"], ["a", "b", "d"], ["a", "b", "e"], ["a", "c", "d"], ["a", "c", "e"], ["a", "d", "e"], ["b", "c", "d"], ["b", "c", "e"], ["b", "d", "e"], ["c", "d", "e"]]

Однако это не ВСЕ комбинации, только уникальныеиз них, например, ["e", "a", "b"] отсутствует

Когда я аналогично пытаюсь с меньшим массивом s, я получаю только один результат:

irb(main):059:0> %w(a b c).combination(3).to_a  
=> [["a", "b", "c"]]

Как я могу получить все 6 комбинаций, то есть для ['a', 'b', 'c']Я хочу получить

[['a','b','c'], ['a','c','b'], ['b', 'a', 'c'], ['b', 'c', 'a'], ['c', 'a', 'b'], ['c', 'b', 'a']

Аналогично для [1,2,3,4], если я хочу все 3-значный комбо, я должен получить

irb(main):074:0> [[1,2,3],[1,2,4],[1,3,2],[1,3,4],[1,4,2],[1,4,3],  [2,1,3],[2,1,4],[2,3,4],[2,3,1],[2,4,1],[2,4,2],  [3,1,2],[3,1,4],[3,2,3],[3,2,4],[3,4,2],[3,4,1]]

?

1 Ответ

2 голосов
/ 26 мая 2019

Вы ищете permutation вместо combination.

В комбинациях мы не заботимся о порядке элементов, а заботимся только о наличии всех элементов в наборе.

[1,2,3,4].permutation(3).to_a
#=> [[1, 2, 3], [1, 2, 4], [1, 3, 2], [1, 3, 4], [1, 4, 2], [1, 4, 3], [2, 1, 3], [2, 1, 4], [2, 3, 1], [2, 3, 4], [2, 4, 1], [2, 4, 3], [3, 1, 2], [3, 1, 4], [3, 2, 1], [3, 2, 4], [3, 4, 1], [3, 4, 2], [4, 1, 2], [4, 1, 3], [4, 2, 1], [4, 2, 3], [4, 3, 1], [4, 3, 2]]
...