2016-08-14 61 views
0

我正在處理一個問題,我需要將數字與數字數組進行比較,以查看4個數字中的3個是否匹配。紅寶石 - 使用多維數組比較數字

例如:

winning_numbers = [["2537"], ["1294"], ["5142"]] 

my_number = "1234" 

如果比較有3個相同的數字返回true。如果比較結果小於3或完全匹配,則返回false。

從我讀過的我正在使用多維數組,但我不明白如何在每個數組中循環每個數組,以便我可以將其與我的編號進行比較。

任何幫助將不勝感激。

回答

0

你可以做這樣的事情,返回所有匹配的數字:

winning_numbers.select do |number| 
    (number.first.split(//) & my_number.split(//)).size >= 3 
end 
#=> [["1294"], ["5142"]] 

你可能想使用的find代替select,當你只關心到第一個匹配的winning_number

+0

當有重複的號碼這是行不通的。例如,如果'winning_numbers = [[「1111」]]; my_number =「1112」',你返回一個空數組,儘管'[[「1111」]]是一個匹配項。 –

0

如果沒有重複的數字我們可以使用數組路口:

def triple?(winning_numbers, my_number) 
    my_number_arr = my_number.chars 
    winning_numbers.any? { |(w)| w.chars & my_number_arr).size == 3 } 
end 

winning_numbers = [["2537"], ["1294"], ["5142"]] 
my_number = "1234" 

triple?(winning_numbers, my_number) #=> true, matches "1294" 

或者,而不是w.chars & my_number_arr).size == 3,我們可以寫

(w.chars - my_number_arr).size == 1 # (4-3=1) 

這不起作用,但是,當字符串有重複數字,這當然必須考慮在內。

I have proposed表明採用方法Array#difference作爲Ruby核心方法。這對於這個問題來說是完美的。請參閱我的回答Array#difference以瞭解其用途示例。

def triple?(winning_numbers, my_number) 
    my_number_arr = my_number.chars 
    winning_numbers.any? { |(w)| puts my_number_arr.difference(w.chars).size == 1 } 
end 

winning_numbers = [["2537"], ["1294"], ["5142"]] 
my_number = "1234" 

triple?(winning_numbers, my_number) #=> true, matches "1294" 

包含重複數字又如:

winning_numbers = [["1551"], ["1594"], ["1141"]] 

triple?(winning_numbers, my_number) # matches "1141" 

,並在沒有比賽的三位數字的例子:

winning_numbers = [["1551"], ["1594"], ["1561"]] 

triple?(winning_numbers, my_number) #=> false (no match)