4

次のような配列を作成する方法を探していました。

[[1,1], [1,2], [1,3]
[2,1], [2,2], [2,3]
[3,1], [3,2], [3,3]]

今のところ、私はこの解決策を思いつきました:

w=3 # or any int
h=3 # or any int
array = []
iw=1
while iw<=w do
  ih=1
  while ih <=h do
    array<<[iw, ih]
    ih+=1
  end#do
  iw+=1
end#do

しかし、もっと速い方法があるに違いないと確信しています..?これには 1.107 秒かかります... (w=1900; h=1080) よろしく

編集: 1.8.6 で立ち往生していることに気付くべきでした..

4

3 に答える 3

6

またはのいずれproductかを使用しrepeated_permutationます。

[1, 2, 3].product([1, 2, 3]) # => [[1, 1], ...
# or
[1, 2, 3].repeated_permutation(2) # => [[1, 1], ...

productは Ruby 1.8.7+ (1.9.2+ でブロックを受け入れます) ですがrepeated_permutation、1.9.2+ です。他のバージョンの Ruby では、include my backportsgem およびinclude 'backports/1.9.2/array/repeated_permutation'orを使用できますinclude 'backports/1.8.7/array/product'

于 2013-01-30T20:37:08.083 に答える
4

これは@nicoogaの答えに似ていますが、配列を手動で作成する代わりに範囲を使用します(つまり、より大きな配列の場合は各数値を入力する必要はありません).

range = (1..3).to_a
range.product(range)
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
于 2013-01-30T20:13:43.113 に答える
3

もっと速い方法があります:

> [1,2,3].product([1,2,3])
=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
于 2013-01-30T20:09:05.407 に答える