Ruby 数组乘法-最好的算法是什么?
我必须对n个数组进行乘法 例如: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",
- 输入=[“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