我正在处理一个问题,我需要将数字与数字数组进行比较,以查看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”]]是一个匹配项。 –