Ruby 数组乘法-最好的算法是什么?

Ruby 数组乘法-最好的算法是什么?,ruby,Ruby,我必须对n个数组进行乘法 例如: 输入=[“a”、“b”、“c”]*[“1”、“2”]*[“&”、“(”、“$”] 输出=[“a1&”,“a1(”,“a1$”,“a2$”,“a2(”,“a2$”,“b1$”,“b1(”,“b2$”,“b2$,“c1$,“c2$”,“c2(,“c2$”)] 我已经创建了一个算法来实现这一点,它工作得很好 # input entries = ["$var1$", "$var2$", "$var3$"] data = [["a", "b", "c"], ["1",

我必须对n个数组进行乘法

例如:

  • 输入=[“a”、“b”、“c”]*[“1”、“2”]*[“&”、“(”、“$”]
  • 输出=[“a1&”,“a1(”,“a1$”,“a2$”,“a2(”,“a2$”,“b1$”,“b1(”,“b2$”,“b2$,“c1$,“c2$”,“c2(,“c2$”)]
我已经创建了一个算法来实现这一点,它工作得很好

# input
entries = ["$var1$", "$var2$", "$var3$"]
data = [["a", "b", "c"], ["1", "2"], ["&", "(", "$"]]

num_combinaison = 1
data.each { |item| num_combinaison = num_combinaison * item.length  }

result = []
for i in 1..num_combinaison do
  result.push entries.join()
end

num_repetition = num_combinaison
data.each_index do |index|
  item = Array.new(data[index])
  num_repetition = num_repetition / item.length
  for i in 1..num_combinaison do
    result[i-1].gsub!(entries[index], item[0])
    if i % num_repetition == 0
      item.shift
      item = Array.new(data[index]) if item.length == 0
    end
  end
end
我相信有一个最好的方法可以做到这一点,但我没有找到。我曾尝试使用产品或展平功能,但没有成功

有人看到了最好的解决方案吗

谢谢你的帮助


Eric

您可以使用的最佳算法是通过以下方法实现的:

更新
如果
数据
为emtpy,则我的第一个解决方案会提出一个
命名错误
,这是一个更安全的选择:

data.reduce { |result, ary| result.product(ary).map(&:join) }
# => ["a1&", "a1(", "a1$", "a2&", "a2(", "a2$", ...

[].reduce { |r, a| r.product(a).map(&:join) }
# => nil

您可以使用的最佳算法是通过以下方法实现的:

更新
如果
数据
为emtpy,则我的第一个解决方案会提出一个
命名错误
,这是一个更安全的选择:

data.reduce { |result, ary| result.product(ary).map(&:join) }
# => ["a1&", "a1(", "a1$", "a2&", "a2(", "a2$", ...

[].reduce { |r, a| r.product(a).map(&:join) }
# => nil

虽然这可能是最好的解决方案,但至少在不保留其原始行为的情况下重写stdlib方法不是一个好主意。@toro2k这正是OP想要的。您应该对OP的问题进行评论。@sawa-谢谢,这正是我想要的want@toro2k-也谢谢你的帮助:)虽然这可能是最好的解决方案,但至少在不保留其原始行为的情况下重写stdlib方法不是一个好主意。@toro2k这正是OP想要的。您应该对OP的问题进行评论。@sawa-谢谢,这正是我想要的want@toro2k-也谢谢你的帮助:)
data.reduce { |result, ary| result.product(ary).map(&:join) }
# => ["a1&", "a1(", "a1$", "a2&", "a2(", "a2$", ...

[].reduce { |r, a| r.product(a).map(&:join) }
# => nil