Подтвердить что ты не робот

Ruby все возможные перестановки массива массивов (один лайнер?)

Вопросы, подобные этому, были заданы ранее на SO, но они не совсем то, что мне нужно, и я не могу прийти к моему решению, изменяя/изменяя эти подходы.

В любом случае у меня есть массив массивов, как показано ниже:

b= [["1"],["2"],["3"],["4"],["5"],["6"]]

(Если это облегчает получение решения, b также может быть одномерным массивом, следующим образом: ["1","2","3","4","5","6"]. Любой тип ввода работает для моих нужд.)

и я хотел бы сгенерировать следующее:

[["123456"],["213456"],["312456"],...] 

где каждый массив в выходном массиве является уникальной перестановкой шести чисел. Я бы также принял его как один массив (например, ["123456", "213456",...]). Порядок вывода не имеет особого значения, если каждая запись уникальна и число строк не повторяется в строке (например, "112345" недопустимо). Все 6 номеров также должны использоваться в каждой записи, поэтому меня не интересует инкрементный вывод, например, "123".

Как бы это ни звучало, это не проблема домашней работы. Я мог бы переработать эту штуку и получить необходимую мне информацию. Я просто чувствую, что должно быть лучшее, более элегантное решение.

4b9b3361

Ответ 2

Ruby делает это изначально:) Из рубиновой документации:

a = [1, 2, 3]
a.permutation.to_a     #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutation(1).to_a  #=> [[1],[2],[3]]
a.permutation(2).to_a  #=> [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]
a.permutation(3).to_a  #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a.permutation(0).to_a  #=> [[]] # one permutation of length 0
a.permutation(4).to_a  #=> []   # no permutations of length 4

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-permutation

Ответ 3

Вам обязательно нужно взглянуть на Perthation Gem. Пример из документации

perm = Permutation.new(3)
# => #<Permutation:0x57dc94 @last=5, @rank=0, @size=3>
colors = [:r, :g, :b]
# => [:r, :g, :b]
perm.map { |p| p.project(colors) }
# => [[:r, :g, :b], [:r, :b, :g], [:g, :r, :b], [:g, :b, :r], [:b, :r, :g],
#  [:b, :g, :r]]

UPDATE

Если вы используете Ruby > 1.8.6, встроен Array.permutation.

Ответ 4

Это должно сделать это:

b.permutation.to_a.collect! { |i| i = [i.flatten.join] }