我有一个熟悉的问题,看起来像是数学世界的排列/组合。
如何通过ruby实现以下功能?
badges = "1-2-3"
badge_cascade = []
badges.split("-").each do |b|
badge_cascade << b
end
Gives: => ["1", "2", "3"]
But I want it to be is:
=> ["1", "2", "3",
"1-2", "2-3", "3-1", "2-1", "3-2", "1-3",
"1-2-3", "2-3-1", "3-1-2"]发布于 2012-01-26 22:30:19
函数式方法:
bs = "1-2-3".split("-")
strings = 1.upto(bs.size).flat_map do |n|
bs.permutation(n).map { |vs| vs.join("-") }
end
#=> ["1", "2", "3", "1-2", "1-3", "2-1", "2-3", "3-1", "3-2", "1-2-3", "1-3-2", "2-1-3", "2-3-1", "3-1-2", "3-2-1"]发布于 2012-01-26 21:55:28
你需要使用Array#permutation方法来获得所有的排列:
arr = "1-2-3".split '-' # => ["1", "2", "3"]
res = (1..arr.length).reduce([]) { |res, length|
res += arr.permutation(length).to_a
}.map {|arr| arr.join('-')}
puts res.inspect
# => ["1", "2", "3", "1-2", "1-3", "2-1", "2-3", "3-1", "3-2", "1-2-3", "1-3-2", "2-1-3", "2-3-1", "3-1-2", "3-2-1"]让我来解释一下代码:
'-'传递给String#split方法1..arr.length表示所有这些长度。C11收集所有排列的数组。你将在这里得到数组的数组:["1","2","3","1","2","1","3","2","1","2","3","3","3","2","1","2","3","1","3","3","2","1","3","2",“3”,"1","3","1","2","3","2",“1”]
在Enumerable#map
中使用'-'分隔符,使用Array#join将此数组的所有子数组转换为字符串
发布于 2012-01-26 21:56:46
Array#permutation(n)会给出长度为n的所有排列作为数组的数组,所以你可以调用它,每个排列的长度介于1和徽章中的位数之间。最后一步是将所有这些内容映射回以-分隔的字符串。
badges = "1-2-3"
badges_split = badges.split('-')
permutations = []
(1..badges_split.size).each do |n|
permutations += badges_split.permutation(n).to_a
end
result = permutations.map { |permutation| permutation.join('-') }更新:我认为reduce的使用是一种更优雅的方法,但我将把这个答案留在这里,以防它有用。
https://stackoverflow.com/questions/9019007
复制相似问题