If there were no duplicate digits we could use array intersection:
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"
Alternatively, instead of w.chars & my_number_arr).size == 3
, we could write
(w.chars - my_number_arr).size == 1 # (4-3=1)
This does not work, however, when strings have duplicate digits, which, of course, must be accounted for.
I have proposed that a method Array#difference
be adopted as a Ruby core method. It would be perfect for this problem. See my answer at Array#difference for examples of its uses.
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"
Another example that includes duplicate digits:
winning_numbers = [["1551"], ["1594"], ["1141"]]
triple?(winning_numbers, my_number) # matches "1141"
and an example where there is no match on three digits:
winning_numbers = [["1551"], ["1594"], ["1561"]]
triple?(winning_numbers, my_number) #=> false (no match)