Ruby – 使用多维数组比较数字

我正在研究一个问题,我需要将数字与一组数字进行比较,看看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"]] 

当您只对第一个匹配的winning_number感兴趣时,您可能希望使用find而不是select

如果没有重复的数字,我们可以使用数组交集:

 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) 

但是,当字符串具有重复数字时,这不起作用,当然,必须考虑这些数字。

我建议采用一种方法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)