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]
Ответ 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]