2013-03-04 7 views
0

Мне нужно сгенерировать каждую возможную комбинацию букв a по z по длине. Я знаю, что смогу это сделать:Создать все возможные комбинации строк, включая повторы для заданной длины?

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

Но проблема в том, что дубликаты удалены. Если длина равна 2, мне нужно все от aa до zz, включая ab и ba и т. Д. Я знаю, что это простая процедура, но я не могу ее получить, а мой Google fu отключен.

ответ

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" 
] 

EDIT:

... Я генерировать на основе длины.

Затем используйте длину.

 
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

+0

См. Добавленное редактирование. –

Смежные вопросы