Как разработать массив Ruby - PullRequest
0 голосов
/ 17 июля 2011

У меня есть факторизованный массив из n измерений, и я хотел бы его разработать.

Вот пример:

develop([:a, :aa]) #=> [[:a, :aa]]

..., который совпадает с: [:a].product([:aa]).

Или, что сложнее:

develop([:a, [:aa, :bb]]) #=> [[:a, :aa],
                               [:a, :bb]]

Я работаю с Ruby 1.9.Спасибо за любую идею.

Редактировать:

Другой пример с 3 уровнями встроенных массивов:

develop([:a, [[:b, [:ba, :bb]],
              [:c, [:ca, :cb]],
              [:d, [:da, :db]]]]) #=> [[:a, :b, :ba],
                                       [:a, :b, :bb],
                                       [:a, :c, :ca],
                                       [:a, :c, :cb],
                                       [:a, :d, :da],
                                       [:a, :d, :db]]

Интересно, могли бы мыиспользуйте метод продукта Array (http://ruby -doc.org / core-1.9.3 / Array.html # method-i-product), даже если у нас есть некоторые встроенные массивы.

1 Ответ

2 голосов
/ 17 июля 2011

Я не уверен, что полностью понимаю, что вы пытаетесь сделать с этими плохими массивами, но мне удалось создать функцию, которая дает правильный вывод для обоих указанных вами случаев. Вот полный код:

def develop(x)
  return x unless x.is_a? Array
  y = []
  x[1].each do |s|
    d = develop(s)
    d = [d] unless d.is_a? Array
    d.each do |t|
      t = [t] unless t.is_a? Array
      y << [x.first] + t
    end
  end
  return y
end

x = [:a,
        [
            [:b, [:ba, :bb]],
            [:c, [:ca, :cb]],
            [:d, [:da, :db]]
        ]
    ]

p develop(x)

p develop [:a, [:aa, :bb]]

Вывод:

C:\Users\David\Documents\scraps\test_ruby>ruby test.rb
[[:a, :b, :ba], [:a, :b, :bb], [:a, :c, :ca], [:a, :c, :cb], [:a, :d, :da], [:a, :d, :db]]
[[:a, :aa], [:a, :bb]]

РЕДАКТИРОВАТЬ 1 : вот более короткая версия, которая также дает правильный вывод:

def develop(x)
  return [x] unless x.is_a? Array
  Array(x.last).collect do |s|
    develop(s).collect do |t|
      [x.first] + Array(t)
    end
  end.flatten 1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...