a
長さにz
基づいて、可能なすべての文字の組み合わせを生成する必要があります。私はこれができることを知っています:
('a'..'z').to_a.repeated_combination(2).map(&:join)
しかし、問題は重複が削除されることです。長さが2の場合、となどの間aa
にあるすべてのものが必要です。これは簡単な手順ですが、取得できず、Googlefuがオフになっています。zz
ab
ba
a
長さにz
基づいて、可能なすべての文字の組み合わせを生成する必要があります。私はこれができることを知っています:
('a'..'z').to_a.repeated_combination(2).map(&:join)
しかし、問題は重複が削除されることです。長さが2の場合、となどの間aa
にあるすべてのものが必要です。これは簡単な手順ですが、取得できず、Googlefuがオフになっています。zz
ab
ba
その場合は、repeated_permutation
代わりに使用する必要があります。配列順列
どうですか:
('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
。自分のマシンでベンチマークを実行してテストしてください。