1

私は配列を持っています:

a = [1,1,2,3,4]

その他の配列:

b =[[1,2,3], [1,1,4], [7,3,4], [1,5,6,1]]

の各要素についてbb_i知りたい:

  • b_iそのようなものはありますかa & b_i == b_i、そして
  • それは何ですかb_i

これは私が考えていることです

def get_matching(a, b)
   b.each {|b_i|
      return b_i if (a & b_i) == b_i
   }
end

最初の質問に対する答えを決定するために、戻り値が nil であるかどうかをどこで確認できますか? ただし、そのような一致が存在するかどうかを確認するために実際に一致を返す必要がないように、それらを 2 つの別個の関数として実装することもできます。

多くの場合、最初の一致のみが必要であると仮定します。

これを行うより効率的な方法はありますか?

4

4 に答える 4

3

これはおそらくこれ以上効率的ではありませんが、 Enumerable#detectを使用するともう少しルビー風になります

def get_matching(a, b)
  b.detect{ |b_i| (a & b_i) == b_i }
end
于 2012-10-26T15:17:37.917 に答える
1

return nil関数の最後で行うのを忘れました。

より良い方法は次のとおりです。

def get_matching(a, b)
   b.find do |b_i|
      (a & b_i) == b_i
   end
end

また、配列の等式は要素の順序を考慮していることにも注意してください。次のように書く方が良いかもしれません。

(b_i - a).empty?
于 2012-10-26T15:17:39.113 に答える
1

これにより、b_iがサブセットまたはaと等しいすべての配列が返されます。

b.select { |b_i| (b_i - a).empty? }
于 2012-10-26T20:30:03.330 に答える
1

Ruby Setを使うのには理由があるように思えます

require 'set'

def get_matching(a,b)
  a = a.to_set  
  b.detect { |b_i| b_i.to_set.subset?(a) }
end

もちろん、これは最短の答えではありませんが、似たようなタスクがたくさんある場合は、 Set を使用するのが合理的です。

于 2012-10-26T15:35:20.040 に答える