2013-03-04 107 views
0

我需要根據長度生成字母az的所有可能組合。我知道我可以這樣做:生成字符串的所有可能組合,包括給定長度的重複?

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

但問題是重複被刪除。如果長度爲2,我需要aazz之間的所有內容,包括abba等。我知道這是一個簡單的程序,但我無法得到它,而我的Google fu已關閉。

回答

1

在這種情況下,您需要使用repeated_permutation來代替。 Array Permutation

+0

這就是它!謝謝! – nizbit 2013-03-04 00:48:20

2

如何:

('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。隨意在自己的機器上運行基準測試。

+0

關閉,但我已根據長度生成。 – nizbit 2013-03-04 00:47:59

+0

查看添加的編輯。 – 2013-03-04 03:29:32

相關問題