Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby array from two ranges

I was looking for a way to create an array like:

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

For now I came up with this solution:

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

But, I'm sure there must be a quicker way..? This takes 1.107 seconds... (w=1900; h=1080) Regards

EDIT: I should've noticed that I'm stuck with 1.8.6..

like image 271
KenGey Avatar asked Dec 11 '22 18:12

KenGey


1 Answers

Use either product or repeated_permutation:

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

product is in Ruby 1.8.7+ (accepts a block in 1.9.2+) while repeated_permutation in 1.9.2+. For other versions of Ruby, you can use include my backports gem and include 'backports/1.9.2/array/repeated_permutation' or include 'backports/1.8.7/array/product'.

like image 104
Marc-André Lafortune Avatar answered Dec 14 '22 23:12

Marc-André Lafortune