2015-10-29 5 views
3

Как объединить два диапазона в массив 2d как таковой в ruby? Использование zip не дает результата, который мне нужен.Объединение двух диапазонов в массив 2d Ruby

(0..2) and (0..2) 
# should become => [[0,0],[0,1],[0,2], [1,0],[1,1],[1,2], [2,0],[2,1],[2,2]] 
+0

Добро пожаловать в Переполнение стека. При обращении за помощью вам нужно показать, что вы пробовали. Stack Overflow - это «помогите мне отладить мой кодовый сайт», а не «написать код для моего сайта». См. «[Ask]». –

ответ

1

Я озадачен. Здесь на следующий день после того, как вопрос был опубликован, и никто не предложил очевидное: Array#product:

[*0..2].product [*1..3] 
    #=> [[0, 1], [0, 2], [0, 3], [1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3]] 
0
range_a = (0..2) 
range_b = (5..8) 

def custom_join(a, b) 
    a.inject([]){|carry, a_val| carry += b.collect{|b_val| [a_val, b_val]}} 
end 

p custom_join(range_a, range_b) 

Выход:

[[0, 5], [0, 6], [0, 7], [0, 8], [1, 5], [1, 6], [1, 7], [1, 8], [2, 5], [2, 6], [2, 7], [2, 8]] 
+0

Проверьте 'each_with_object'. Он очистит код в блоке, используемом 'inject'. –

3

Рубин имеет встроенный метод для этого: repeated_permutation.

(0..2).to_a.repeated_permutation(2).to_a 
+0

Квадратная сетка была бы 3x3, что, вероятно, было то, что он хотел. Если нет, то он может отрубить последнюю строку. – baron816

+0

Я не уверен, что это отвечает на вопрос: «Как мне объединить два диапазона в массив 2d ...?» (несмотря на пример). Все остальные ответы предполагают, что оба диапазона не обязательно совпадают. –

0

прямо вперед решение:

range_a = (0..2) 
range_b = (5..8) 

def custom_join(a, b) 
    [].tap{|result| a.map{|i| b.map{|j| result << [i, j]; } } } 
end 
p custom_join(range_a, range_b) 

Выход:

[[0, 5], [0, 6], [0, 7], [0, 8], [1, 5], [1, 6], [1, 7], [1, 8], [2, 5], [2, 6], [2, 7], [2, 8]] 
0

Просто, это будет сделать это:

a = (0...2).to_a 
b = (0..2).to_a 
result = [] 
a.each { |ae| b.each { |be| result << [ae, be] } } 
p result 
# => [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]] 
Смежные вопросы