Однолинейный алгоритм объединения массивов в массивы всех возможных комбинаций значений? - PullRequest
3 голосов
/ 23 января 2011

Не совсем уверен, что вопрос полностью сформирован, но я пытаюсь сделать следующее:

# where the indices correspond to attributes fore example:
# [type, status]
x = %w(a b)
y = %w(c d)
combine(x, y) #=> [["a", "b"], ["a", "d"], ["c", "a"], ["c", "b"]]

Порядок массива всегда один и тот же, поэтому обратные значения, такие как [b, a], не включаются в результат.

Как это называется и как эффективно реализовать это?

Я вижу Массив # перестановка , но это не совсем так ...

Мы надеемся, что это сработает для любого числа массивов и значений: combine(*arrays)

Спасибо!

Обновление

Вот лучший пример того, что я ищу:

Это (x | y).combination(x.length).to_a производит следующее:

x = ["front_door", "open"]
y = ["back_door", "closed"]
(x | y).combination(x.length).to_a
=> [["front_door", "open"], ["front_door", "back_door"], ["front_door", "closed"], ["open", "back_door"], ["open", "closed"], ["back_door", "closed"]] 

Фактический результат, который я ищу, таков:

=> [["front_door", "open"], ["front_door", "closed"], ["back_door", "open"], ["back_door", "closed"]]

Или, если это был более длинный массив:

x = ["house", "front_door", "open"]
y = ["building", "back_door", "closed"]
compute(x, y)
=> ["house", "front_door", "open"], ["house", "back_door", "open"], ["house", "front_door", "closed"], ["house", "back_door", "closed"], ["building", "front_door", "open"], ["building", "back_door", "open"], ["building", "front_door", "closed"], ["building", "back_door", "closed"]

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 23 января 2011

x.zip(y).reduce(:product).map(&:flatten)

и для нескольких массивов:


x.zip(y,z,w).reduce(:product).map(&:flatten)

3 голосов
/ 23 января 2011
(x | y ).combination(x.length).to_a
0 голосов
/ 23 января 2011
def combine(*arrays)
  head, *tail = arrays.transpose
  head.product(*tail)
end

combine(x, y)
combine(x, y, z, ...)

Отклонение от примечания: это один из сценариев, в котором вы понимаете, что функциональные языки говорят о том, что функции важны . Тот факт, что вы должны вызывать метод объекта в ООП, заставляет вас - в этом случае - искусно получить их голову / хвост. Когда у вас есть product как функция, например, в Python, у вас нет таких проблем:

itertools.product(*zip(*arrays))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...