配列内で不一致のインデックスを見つけます

概要

全体に同じ値を含む必要がある配列があり、不一致がある場合は、それらの不一致のインデックスを取得したいと考えています。

例:

[1,1,1,1,3,1,1,1,2,1,1,1]

出力:

[4, 8]

Ruby/Rails でこれを実現する最善の方法は何ですか?

解決策

最も一般的な要素は、tally と max_by を介して取得できます。

arr = [1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1]

most_common = arr.tally.max_by(&:last).first
#=> 1

tably は、各要素の出現数を含むハッシュを返します ({1=>10, 3=>1, 2=>1})。max_by(&:last) は、最も多く出現したペアを返し、最初にその要素の値を返します。 。 (最も一般的な要素が常に 1 つあると仮定します)

インデックスを取得するには、filter_map を利用します。

arr.each_with_index.filter_map { |e, i| i if e != most_common }
#=> [4, 8]

each_with_index は、各要素と対応するインデックスを生成します。 filter_map は、要素が 1 に等しくない場合は要素のインデックスを返すブロックから真実の結果を選択します (そうでない場合は nil が破棄されます)。