Ответ 1
permutations = (1..6).to_a.permutation.map(&:join)
# ["123456", "123465", "123546", ..., "654312", "654321"]
Вопросы, подобные этому, были заданы ранее на SO, но они не совсем то, что мне нужно, и я не могу прийти к моему решению, изменяя/изменяя эти подходы.
В любом случае у меня есть массив массивов, как показано ниже:
b= [["1"],["2"],["3"],["4"],["5"],["6"]]
(Если это облегчает получение решения, b
также может быть одномерным массивом, следующим образом: ["1","2","3","4","5","6"]
. Любой тип ввода работает для моих нужд.)
и я хотел бы сгенерировать следующее:
[["123456"],["213456"],["312456"],...]
где каждый массив в выходном массиве является уникальной перестановкой шести чисел. Я бы также принял его как один массив (например, ["123456", "213456",...]
). Порядок вывода не имеет особого значения, если каждая запись уникальна и число строк не повторяется в строке (например, "112345" недопустимо). Все 6 номеров также должны использоваться в каждой записи, поэтому меня не интересует инкрементный вывод, например, "123"
.
Как бы это ни звучало, это не проблема домашней работы. Я мог бы переработать эту штуку и получить необходимую мне информацию. Я просто чувствую, что должно быть лучшее, более элегантное решение.
permutations = (1..6).to_a.permutation.map(&:join)
# ["123456", "123465", "123546", ..., "654312", "654321"]
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
Вам обязательно нужно взглянуть на 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
.
Это должно сделать это:
b.permutation.to_a.collect! { |i| i = [i.flatten.join] }