a我需要z根据长度生成所有可能的字母组合。我知道我可以这样做:
('a'..'z').to_a.repeated_combination(2).map(&:join)
但问题是删除了重复项。如果长度为 2,我需要 to 之间aa的所有内容zz,包括abandba等。我知道这是一个简单的过程,但我无法得到它,而且我的 Google fu 已关闭。
a我需要z根据长度生成所有可能的字母组合。我知道我可以这样做:
('a'..'z').to_a.repeated_combination(2).map(&:join)
但问题是删除了重复项。如果长度为 2,我需要 to 之间aa的所有内容zz,包括abandba等。我知道这是一个简单的过程,但我无法得到它,而且我的 Google fu 已关闭。
在这种情况下,您需要repeated_permutation改用。数组排列
怎么样:
('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。随意在您自己的机器上运行基准测试。