ruby - 如何在 ruby​​ 中生成部分重复的排列?

标签 ruby algorithm permutation

我有一个数字范围 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

如何更高效地直接生成有效字符串?

最佳答案

问题等价于:从索引0L - 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/

相关文章:

ruby - 正则表达式匹配除结束字符串之外的任何内容

ruby-on-rails - 如果值为空意味着如何从动态属性表中删除字段?

c++ - 很难在 multimap<Class object, enum> 上使用 max_element(也有 min_element)

java - 如何找到乘积大于总和的对

c# - 从问题中生成不同路径的矩阵?,排列?,组合?

python - 如何为给定外群的一组物种生成所有可能的 Newick 树排列?

没有 for 循环的 R 二进制详尽列表

ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改?

Ruby Regex - 匹配文本中的列表

php - 两个日期之间的SQL存储逻辑