我有一个数字范围 R = (1..n)
。我还有另一个字符 'a'
。我想生成长度为 L
(L > n + 2) 的字符串,所有数字都以相同的顺序排列,但要经过 'a'
的每次重复排列以填充长度 L。例如,如果 n = 3
,并且 L = 7
,则一些有效字符串将是:
"123aaaa",
"1a23aaa",
"1aa2a3a",
"aaaa123"
而以下字符串将无效:
"213aaaa", # invalid, because 1,2,3 are not in order
"123a", #invalid, because length < L
"1123aaa", # invalid because a number is repeated
我目前正在这样做,效率太低了:
n = 3
L = 7
all_terms = (1..n).to_a + Array.new(L - n, 'a')
all_terms.permutation.each do |permut|
if(valid_permut? permut) # checks if numbers are in their natural order
puts permut.join
end
end
如何更高效地直接生成有效字符串?
最佳答案
问题等价于:从索引0
到L - 1
中选择n
个元素,用1
填充code> 到 n
相应地,并用一些常量字符填充其余部分。
在您的示例中,它从 0..6
中获取 3
元素:
(0..6).to_a.combination(3).to_a
=> [[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], [0, 1, 6], [0, 2, 3], [0, 2, 4],
[0, 2, 5], [0, 2, 6], [0, 3, 4], [0, 3, 5], [0, 3, 6], [0, 4, 5], [0, 4, 6], [0, 5, 6],
[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5],
[1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6],
[3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6]]
这里的每个子数组代表一个可能的结果。比如[0, 2, 3]
对应'0a12aaa'
,[3, 5, 6]
对应' aaa0a12'
等。此转换的代码很简单。
关于ruby - 如何在 ruby 中生成部分重复的排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32645665/