我有这个熟悉的问题,看起来像数学世界的排列/组合.
如何通过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"]
Run Code Online (Sandbox Code Playgroud)
功能方法:
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"]
Run Code Online (Sandbox Code Playgroud)
您需要使用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"]
Run Code Online (Sandbox Code Playgroud)
让我解释一下代码:
您将字符串拆分为数组,将分隔符传递'-'给String#split方法
您需要长度为1,2,3的所有排列.范围1..arr.length表示所有这些长度.
您使用Enumerable #reduce收集所有排列的数组.您将在此处获得数组:
[["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"]]
Run Code Online (Sandbox Code Playgroud)您可以使用Array#join将此数组的所有子数组转换为字符串,并使用Enumerable #map中的'-'分隔符
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |