2014-01-25 1 views
1

У меня есть потребность в моем коде для вычисления декартова произведения массива с разным количеством раз. Например, если мой массив [1,2] и мне нужно, чтобы заполнить эти значения в три слота, то результат будет:Декартовская мощность (декартово произведение с самопроизвольным временем)

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

Что это самый простой способ сделать это?

ответ

3

Вы, вероятно, ищет перестановки с повторением и Руби Array из стандартной библиотеки, к счастью, implements this:

[1,2].repeated_permutation(3).to_a 
# [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]] 
+0

Спасибо! Я этого раньше не видел. – Phrogz

0

Потому что мне нравится monkeypatching, я ставлю это на самом массиве:

class Array 
    def **(n) 
    self.product(*(n-1).times.map{ self }) 
    end 
end 

я не уверен, если есть более элегантный способ передать п-1 копии себя методу, хотя ,

2

Небольшой вариант вашего ответа:

class Array 
    def **(n) 
    product(*([self]*(n-1))) 
    end 
end 

[1,2]**3 
    # => [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], 
    #  [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]] 
+0

Ах, мне нравится, что гораздо больше, чем ' .times.map'. Благодарю. – Phrogz