之前已经问过与此类似的问题,但它们并不是我所需要的,我似乎无法通过改变/修改这些方法来达到我的解决方案。
在任何情况下,我都有一个数组数组,如下所示:
b= [["1"],["2"],["3"],["4"],["5"],["6"]]
(如果它更容易找到解决方案,b
也可以是一维数组,如下所示:["1","2","3","4","5","6"]
。任何类型的输入都可以满足我的需要。)
我想生成以下内容:
[["123456"],["213456"],["312456"],...]
其中输出数组中的每个数组都是六个数字的唯一排列。我也将它作为单个数组(例如["123456", "213456",...]
)。只要每个条目是唯一的并且字符串中没有数字重复(例如,不允许“112345”),输出的顺序就不是特别重要。所有6个数字也必须在每个条目中使用,所以我对"123"
之类的增量输出也不感兴趣。
尽管听起来像这样,但这不是一个家庭作业问题。我可以为这件事做事,并得到我需要的输出。我觉得必须有一个更好,更优雅的解决方案。
答案 0 :(得分:35)
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] }