【问题标题】:Combine array of array into all possible combinations, forward only, in Ruby在Ruby中将数组数组组合成所有可能的组合,仅向前
【发布时间】:2011-07-10 18:12:52
【问题描述】:

我有一个数组,像这样:

[['1','2'],['a','b'],['x','y']]

我需要将这些数组组合成一个字符串,其中包含所有三个集合的所有可能组合,仅向前。我已经看过很多以任意顺序组合所有可能组合的示例,这不是我想要的。例如,我不希望第一个集合中的任何元素出现在第二个集合之后,或者第三个集合中的任何元素出现在第一个或第二个之前,等等。因此,对于上面的示例,输出将是:

['1ax', '1ay', '1bx', '1by', '2ax', '2ay', '2bx', '2by']

数组的数量,每组的长度是动态的。

有人知道如何用 Ruby 解决这个问题吗?

【问题讨论】:

标签: ruby arrays unique combinations


【解决方案1】:

Know你的Array#product

a = [['1','2'],['a','b'],['x','y']]
a.first.product(*a[1..-1]).map(&:join)

【讨论】:

  • @Travis:如果这回答了您的问题,您可以勾选问题旁边的勾号/复选标记。
  • 它对我不起作用:它只给我['1ax', '2by'] :/
  • @AndrewGrimm 使用transpose 的答案没有做正确的事;我已编辑您的答案以将其删除。
  • 另请注意,您可以这样做:first, *rest = *a; combos = first.product(*rest).map(&:join);恕我直言,这条额外的行比*a[1..-1] 的可读性略有提高。
  • 天哪,谢谢你的回答。一天多来,我一直在绞尽脑汁试图构建这个功能,但不知道 Ruby 已经有一种方法可以完全满足我的需要。 :-/
【解决方案2】:

使用递归解决,所谓的"Dynamic Programming" 方法:

  • 对于 n 数组,将第一个数组的条目与其余 (n-1) 个数组的每个结果组合
  • 对于单个数组,答案就是那个数组

在代码中:

def variations(a)
  first = a.first
  if a.length==1 then
    first
  else
    rest = variations(a[1..-1])
    first.map{ |x| rest.map{ |y| "#{x}#{y}" } }.flatten
  end
end

p variations([['1','2'],['a','b'],['x','y']])
#=> ["1ax", "1ay", "1bx", "1by", "2ax", "2ay", "2bx", "2by"]

puts variations([%w[a b],%w[M N],['-'],%w[x y z],%w[0 1 2]]).join(' ')
#=> aM-x0 aM-x1 aM-x2 aM-y0 aM-y1 aM-y2 aM-z0 aM-z1 aM-z2 aN-x0 aN-x1 aN-x2
#=> aN-y0 aN-y1 aN-y2 aN-z0 aN-z1 aN-z2 bM-x0 bM-x1 bM-x2 bM-y0 bM-y1 bM-y2
#=> bM-z0 bM-z1 bM-z2 bN-x0 bN-x1 bN-x2 bN-y0 bN-y1 bN-y2 bN-z0 bN-z1 bN-z2

您还可以反转逻辑,并且您应该能够以非递归方式实现这一点。但是递归的答案相当简单。 :)

【讨论】:

    【解决方案3】:

    纯,减乘积:

    a = [['1','2'],['a','b'],['x','y']]
    a.reduce() { |acc, n| acc.product(n).map(&:flatten) }.map(&:join)
    #  => ["1ax", "1ay", "1bx", "1by", "2ax", "2ay", "2bx", "2by"]
    

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 2022-01-18
      • 1970-01-01
      • 2016-08-16
      • 2017-04-16
      • 2017-09-15
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多