Ruby所有可能的数组排列(一个内衬?)

时间:2012-07-25 15:40:16

标签: ruby

之前已经问过与此类似的问题,但它们并不是我所需要的,我似乎无法通过改变/修改这些方法来达到我的解决方案。

在任何情况下,我都有一个数组数组,如下所示:

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

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

我想生成以下内容:

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

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

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

4 个答案:

答案 0 :(得分:35)

使用Array#permutation

permutations = (1..6).to_a.permutation.map(&:join)
# ["123456", "123465", "123546", ..., "654312", "654321"]

答案 1 :(得分:17)

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

答案 2 :(得分: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&gt; 1.8.6,内置Array.permutation

答案 3 :(得分:1)

这应该这样做:

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