Combinaison ruby Array multidimensionnel для получения массива двухмерных
У меня есть массив с несколькими размерами, например:
[[1, 1, 4], [2],[2, 3]]
Как получить combinaison каждый элемент, кроме combinaison в том же массиве: [1, 1], [1, 4], [2, 3]
Я хочу получить:
[1, 2],[1, 3],[4, 2],[4, 3],[2, 3]
Спасибо.
Ответы
Ответ 1
Короткий ответ:
[[1, 1, 4], [2],[2, 3]].combination(2).flat_map {|x,y| x.product(y)}.uniq
# => [[1, 2], [4, 2], [1, 3], [4, 3], [2, 2], [2, 3]]
Шаг за шагом
-
step1 = [[1, 1, 4], [2],[2, 3]].combination(2)
# => [[[1, 1, 4], [2]], [[1, 1, 4], [2, 3]], [[2], [2, 3]]]
-
step2 = step1.flat_map {|x,y| x.product(y)}
# => [[1, 2], [1, 2], [4, 2], [1, 2], [1, 3], [1, 2], [1, 3], [4, 2], [4, 3], [2, 2], [2, 3]]
-
result = step2.uniq
# => [[1, 2], [4, 2], [1, 3], [4, 3], [2, 2], [2, 3]]
Обновление
Для полной уникальности вы можете использовать:
[[1, 1, 4], [2],[2, 3, 4]].combination(2).flat_map {|x,y| x.product(y)}.map(&:sort).uniq
Ответ 2
arr = [[1, 1, 4], [2], [2, 3]]
a = arr.map(&:uniq)
(arr.size-1).times.flat_map { |i| arr[i].product(arr[i+1..-1].flatten.uniq)}.uniq
#=> [[1,2],[1,3],[4,2],[4,3],[2,2],[2,3]]
Здесь другой способ, который использует метод Array#difference
, который я определил здесь:
arr.flatten.combination(2).to_a.difference(arr.flat_map { |a| a.combination(2).to_a }).uniq
Array#difference
похож на Array # -. Разница проиллюстрирована в следующем примере:
a = [1,2,3,4,3,2,2,4]
b = [2,3,4,4,4]
a - b #=> [1]
a.difference b #=> [1, 3, 2, 2]