我正在處理一個問題,我需要將數字與數字數組進行比較,以查看4個數字中的3個是否匹配。紅寶石 - 使用多維數組比較數字
例如:
winning_numbers = [["2537"], ["1294"], ["5142"]]
my_number = "1234"
如果比較有3個相同的數字返回true。如果比較結果小於3或完全匹配,則返回false。
從我讀過的我正在使用多維數組,但我不明白如何在每個數組中循環每個數組,以便我可以將其與我的編號進行比較。
任何幫助將不勝感激。
我正在處理一個問題,我需要將數字與數字數組進行比較,以查看4個數字中的3個是否匹配。紅寶石 - 使用多維數組比較數字
例如:
winning_numbers = [["2537"], ["1294"], ["5142"]]
my_number = "1234"
如果比較有3個相同的數字返回true。如果比較結果小於3或完全匹配,則返回false。
從我讀過的我正在使用多維數組,但我不明白如何在每個數組中循環每個數組,以便我可以將其與我的編號進行比較。
任何幫助將不勝感激。
你可以做這樣的事情,返回所有匹配的數字:
winning_numbers.select do |number|
(number.first.split(//) & my_number.split(//)).size >= 3
end
#=> [["1294"], ["5142"]]
你可能想使用的find
代替select
,當你只關心到第一個匹配的winning_number
。
如果沒有重複的數字我們可以使用數組路口:
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)
當有重複的號碼這是行不通的。例如,如果'winning_numbers = [[「1111」]]; my_number =「1112」',你返回一個空數組,儘管'[[「1111」]]是一個匹配項。 –