我需要根據長度生成字母a
至z
的所有可能組合。我知道我可以這樣做:生成字符串的所有可能組合,包括給定長度的重複?
('a'..'z').to_a.repeated_combination(2).map(&:join)
但問題是重複被刪除。如果長度爲2,我需要aa
至zz
之間的所有內容,包括ab
和ba
等。我知道這是一個簡單的程序,但我無法得到它,而我的Google fu已關閉。
我需要根據長度生成字母a
至z
的所有可能組合。我知道我可以這樣做:生成字符串的所有可能組合,包括給定長度的重複?
('a'..'z').to_a.repeated_combination(2).map(&:join)
但問題是重複被刪除。如果長度爲2,我需要aa
至zz
之間的所有內容,包括ab
和ba
等。我知道這是一個簡單的程序,但我無法得到它,而我的Google fu已關閉。
在這種情況下,您需要使用repeated_permutation
來代替。 Array Permutation
如何:
('aa'..'zz').to_a
縮短的版本是這樣的:
'aa'..'bb').to_a [ [ 0] "aa", [ 1] "ab", [ 2] "ac", [ 3] "ad", [ 4] "ae", [ 5] "af", [ 6] "ag", [ 7] "ah", [ 8] "ai", [ 9] "aj", [10] "ak", [11] "al", [12] "am", [13] "an", [14] "ao", [15] "ap", [16] "aq", [17] "ar", [18] "as", [19] "at", [20] "au", [21] "av", [22] "aw", [23] "ax", [24] "ay", [25] "az", [26] "ba", [27] "bb" ]
編輯:
...我已經根據長度產生。
然後使用長度。
length = 2 (('a' * length) .. ('z' * length)).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
。隨意在自己的機器上運行基準測試。
關閉,但我已根據長度生成。 – nizbit 2013-03-04 00:47:59
查看添加的編輯。 – 2013-03-04 03:29:32
這就是它!謝謝! – nizbit 2013-03-04 00:48:20