0

a我需要z根据长度生成所有可能的字母组合。我知道我可以这样做:

('a'..'z').to_a.repeated_combination(2).map(&:join)

但问题是删除了重复项。如果长度为 2,我需要 to 之间aa的所有内容zz,包括abandba等。我知道这是一个简单的过程,但我无法得到它,而且我的 Google fu 已关闭。

4

2 回答 2

2

在这种情况下,您需要repeated_permutation改用。数组排列

于 2013-03-04T00:17:31.247 回答
2

怎么样:

('aa'..'zz').to_a

缩短版本如下所示:

'aa'..'bb').to_a
[
    [0]“啊”,
    [1] "ab",
    [2]“交流”,
    [3]“广告”,
    [4] “AE”,
    [5]“AF”,
    [6] “ag”,
    [7]“啊”,
    [8]“爱”,
    [ 9] “阿杰”,
    [10] “阿克”,
    [11] “人”,
    [12] “我”,
    [13] “一个”,
    [14] “奥”,
    [15] “AP”,
    [16] “水”,
    [17] “阿尔”,
    [18] “作为”,
    [19] “在”,
    [20] “非”,
    [21] “av”,
    [22] “啊”,
    [23] “斧头”,
    [24] “啊”,
    [25] “阿兹”,
    [26] “巴”,
    [27] “bb”
]

编辑:

...我根据长度生成。

然后使用长度。

长度 = 2
(('a' * 长度) .. ('z' * 长度)).to_a

这是生成组合的一种非常快速的方法:

require 'benchmark'

N = 1_000

1.upto(3) do |length|
  puts %Q[Length: #{ length }, generating "#{ 'a' * length }" to "#{ 'z' * length }"]
  Benchmark.bm(11) do |b|
    b.report('permutation') { N.times { ('a'..'z').to_a.repeated_permutation(length).map(&:join) }}
    b.report('range') { N.times { (('a' * length) .. ('z' * length)).to_a }}
  end
end

哪个输出:

Length: 1, generating "a" to "z"
                  user     system      total        real
permutation   0.030000   0.000000   0.030000 (  0.028286)
range         0.010000   0.000000   0.010000 (  0.009942)
Length: 2, generating "aa" to "zz"
                  user     system      total        real
permutation   0.500000   0.010000   0.510000 (  0.504663)
range         0.240000   0.000000   0.240000 (  0.240362)
Length: 3, generating "aaa" to "zzz"
                  user     system      total        real
permutation  15.350000   0.140000  15.490000 ( 15.535756)
range         6.200000   0.000000   6.200000 (  6.221575)

“排列”的时间比我愿意等待的时间长4。随意在您自己的机器上运行基准测试。

于 2013-03-04T00:20:22.820 回答