Robert Klemme wrote: > 2010/9/14 Jörg W Mittag <JoergWMittag+Ruby / googlemail.com>: >> Handy Gandy wrote: >>> I have an array of N arrays A_i: [A_1,A_2,...,A_N]. >>> >>> I want to iterate over the cartesian product A_1xA_2...xA_N. >>> >>> Is there a simple way of doing this without specifying N? >> ary = [[1, 2], [3, 4, 5], [6, 7, 8, 9]] >> ary.first.product(*ary.drop(1)) >> # => [ >> # => [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 3, 9], >> # => [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9], >> # => [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9], >> # => [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 3, 9], >> # => [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9], >> # => [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9] >> # => ] > This looks nice. How did you do the formatting? By hand :-) Though I assume Hirb or awesome_print could probably do it automatically. > If destruction is allowed, we can do: > > irb(main):013:0> ary = [[1, 2], [3, 4, 5], [6, 7, 8, 9]] > => [[1, 2], [3, 4, 5], [6, 7, 8, 9]] > irb(main):014:0> pp ary.shift.product(*ary) > [[1, 3, 6], > ... > => nil That's nice. Having toyed with Scala and Haskell, mutation just feels *so* dirty to me. I guess I need some re-education to get back into the idiomatic Ruby mindset. jwm