2011-04-07 7 views
12

Tengo la siguiente matriz multidimensional en Ruby:Creación de permutaciones de una matriz multidimensional en Ruby

[[1,2], [3], [4,5,6]] 

tengo que tener el siguiente resultado:

[[1,3,4], [1,3,5], [1,3,6], [2,3,4], [2,3,5], [2,3,6]] 

He intentado crear una función recursiva, pero no estoy teniendo mucha suerte.

¿Hay alguna función de Ruby que ayudaría con esto? ¿O es la única opción para hacerlo recursivamente?

Gracias

+3

Siempre debe mostrar el código que ha intentado, incluso cuando él didn no funciona A veces, la solución es una modificación menor. Otras veces obtendrá soluciones alternativas. Siempre podremos decir si realmente ha intentado algo o simplemente está buscando respuestas. –

Respuesta

29

Yup, Array#product hace justamente eso (Cartesian product):

a = [[1,2], [3], [4,5,6]] 
head, *rest = a # head = [1,2], rest = [[3], [4,5,6]] 
head.product(*rest) 
#=> [[1, 3, 4], [1, 3, 5], [1, 3, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6]] 

Otra variante:

a.inject(&:product).map(&:flatten) 
#=> [[1, 3, 4], [1, 3, 5], [1, 3, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6]] 
Cuestiones relacionadas