2014-03-24 5 views
1

n 개의 배열을 곱해야합니다.배열 곱셈 - 가장 좋은 알고리즘은 무엇입니까?

예 :

  • 입력 = "A", "B", "C"] * [ "1", "2"] * [ "&", "(", "$" ]
  • 출력 = "A1 &", "A1 (", "(A1)을 $", "A2 &", "A2 (", "(A2)의 $", "B1 &", "B1 (", "B1을 $ ","B2 & ","B2 (","B2 $으로, "C1 &"C1 ("C1을 $"C2 & ","C2 (","C2의 $ "]

I 하 v 전자가 그것을 할 수있는 알고리즘을 만들었습니다.

# 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 

나는 그것을 할 수있는 가장 좋은 방법이있을 것이라고 확신하지만 그것을 찾지 못했습니다. 나는 성공없이 제품 또는 평평 기능을 사용하려고 노력했다.

누군가가 최상의 해결책을 알고 있습니까?

도움 주셔서 감사합니다.

에릭

답변

4
class Array 
    def * other; product(other).map(&:join) end 
end 

["a", "b", "c"] * ["1", "2"] * ["&", "(", "$"] 
# => 
# ["a1&", "a1(", "a1$", "a2&", "a2(", "a2$", "b1&", "b1(", "b1$", "b2&", 
# "b2(", "b2$", "c1&", "c1(", "c1$", "c2&", "c2(", "c2$"] 
+1

아마도 이것이 가장 좋은 해결책 일 수 있지만 적어도 원래 동작을 유지하지 않고 stdlib 메서드를 재정의하는 것은 좋은 생각이 아닙니다. – toro2k

+0

@ toro2k 이것은 OP가 원했던 것과 정확히 같습니다. OP 질문에 대해 언급해야합니다. – sawa

+0

@sawa - 고마워요. 정확히 제가 원하는 것입니다. – elhostis

3

사용할 수있는 가장 좋은 알고리즘은 Array#product 방법으로 구현됩니다 dataNoMethodError 경우

data = [["a", "b", "c"], ["1", "2"], ["&", "(", "$"]] 
data.first.product(*entries.drop(1)).map(&:join) 
# => ["a1&", "a1(", "a1$", "a2&", "a2(", "a2$", ... 

업데이트
더 안전한 대안은 내 첫 번째 솔루션은 제기 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 
관련 문제