给出以下数组:
@array = ["012", "345", "678", "048", "246", "036", "147", "258"]
我怎样才能检查变量@register
中的3位是否与数组中的3位数相匹配而不关心所述3位数的顺序?
即。 [sic] @register
的值为"012"
,"210"
,"102"
,"246"
和"174"
会产生true
,但"014"
和"247"
不会。
答案 0 :(得分:2)
require 'set'
def is_present?(array, register)
array.map { |s| s.chars.to_set }.include?(register.chars.to_set)
end
array = ["012", "345", "678", "048", "246", "036", "147", "258"]
["012", "210", "102", "246", "174", "014", "247"].each { |s|
puts "#{s} => #{is_present?(array, s)}" }
012 => true
210 => true
102 => true
246 => true
174 => true
014 => false
247 => false
如果(与OP的示例不同)前导零可以在register
的值或array
的元素中省略(例如,s = "12"
而不是{{1使用零填充字符串以使它们全部为三个字符是明智的:
s = "012"
答案 1 :(得分:1)
可能效率远低于其他答案,但在这里使用Array#permutation
似乎很有语义,所以:
def any_perm? str, arr
arr.any? { |e| e.chars.permutation(3).include? str.chars }
end
array = ["012", "345", "678", "048", "246", "036", "147", "258"]
any_perm? "210", array #=> true
any_perm? "102", array #=> true
any_perm? "012", array #=> true
any_perm? "852", array #=> true
any_perm? "111", array #=> false
any_perm? "259", array #=> false
显然,如果您愿意,可以推广方法中的3
。
答案 2 :(得分:0)
给出两个值数组,例如:
a = %w[ 012 345 678 ]
b = %w[ 345 678 123 ]
c = %w[ 000 111 123 ]
然后,您可以使用Array#&
方法计算交叉点:
a & b
# => ["345", "678"]
a & c
# => []
b & c
# => ["123"]
您还可以快速测试任何重叠:
(a & b).any?
# => true
(a & c).any?
# => false
(b & c).any?
# => true