15

之前已经在 SO 上提出过类似的问题,但它们并不是我所需要的,而且我似乎无法通过更改/修改这些方法来找到我的解决方案。

无论如何,我有一个数组数组,如下所示:

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

(如果它更容易得出解决方案,b也可以是一维数组,如下所示:["1","2","3","4","5","6"]。任何一种类型的输入都可以满足我的需要。)

我想生成以下内容:

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

其中输出数组中的每个数组都是六个数字的唯一排列。我也会把它当作一个单一的数组(例如,["123456", "213456",...])。只要每个条目都是唯一的并且字符串中没有数字重复(例如,不允许“112345”),输出的顺序就不是特别重要。每个条目中也必须使用所有 6 个数字,所以我对增量输出也不感兴趣"123"

尽管这听起来很像,但这不是家庭作业问题。我可以为这件事疯狂并获得我需要的输出。我只是觉得必须有一个更好、更优雅的解决方案。

4

4 回答 4

37

使用Array#permutation

permutations = (1..6).to_a.permutation.map(&:join)
# ["123456", "123465", "123546", ..., "654312", "654321"]
于 2012-07-25T15:56:34.510 回答
19

Ruby 本身就是这样做的 :) 来自 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

于 2012-07-25T15:51:03.100 回答
1

你绝对应该看看Permutation 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]]

更新

如果您使用的是 Ruby > 1.8.6,Array.permutation则内置。

于 2012-07-25T15:46:58.193 回答
1

这应该这样做:

b.permutation.to_a.collect! { |i| i = [i.flatten.join] }
于 2012-07-25T16:12:56.490 回答