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)

相关内容

  • 没有找到相关文章

最新更新