0

a長さにz基づいて、可能なすべての文字の組み合わせを生成する必要があります。私はこれができることを知っています:

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

しかし、問題は重複が削除されることです。長さが2の場合、となどの間aaにあるすべてのものが必要です。これは簡単な手順ですが、取得できず、Googlefuがオフになっています。zzabba

4

2 に答える 2

2

その場合は、repeated_permutation代わりに使用する必要があります。配列順列

于 2013-03-04T00:17:31.247 に答える
2

どうですか:

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

短縮バージョンは次のようになります。

'aa' ..'bb')。to_a
[
    [0]「aa」、
    [1]「ab」、
    [2]「ac」、
    [3]「広告」、
    [4]「ae」、
    [5]「af」、
    [6]「ag」、
    [7]「ああ」、
    [8]「ai」、
    [9]「aj」、
    [10]「ak」、
    [11]「アル」、
    [12]「午前」、
    [13]「あん」、
    [14]「ao」、
    [15]「ap」、
    [16]「aq」、
    [17]「ar」、
    [18]「as」、
    [19]「で」、
    [20]「au」、
    [21]「av」、
    [22]「aw」、
    [23]「ax」、
    [24]「ay」、
    [25]「az」、
    [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 に答える