0

特定の数字の 3 回以上の繰り返しを含む配列があるとします。これらの繰り返しのうち 3 つだけを削除し、残りの数字のインスタンスを結果の配列に残します。

例えば:

a = [2, 2, 2, 1, 6]
b = a.map{|i|
    num = a.select{|v| v == i}.size
    num == 3 ? "" : i
    }.reject{|v|
        v == ""
    }

私の望む結果が得られます:

b == [1, 6]

ただし、以下の例では、最後の「2」を配列に残しておきたいと考えています。

# I want to reject ONLY triplets.
# In the below example, the last "2" should remain
a = [2, 2, 2, 1, 2]
b = a.map{|i|
    num = a.select{|v| v == i}.size
    num == 3 ? "" : i
    }.reject{|v|
        v == ""
    }

ここでの結果は次のとおりです。

b == [2, 2, 2, 1, 2]

結果を次のようにしたい:

b == [1, 2]

少し異なるロジックを使用して、上記のものと同様の別のコード ブロックもありますが、最終的には同じ結果になります。

a = [2, 2, 2, 1, 2]
newdice = a.reject { |v|
    if a.count(v) == 3
        x = v
    end
    v == x
    }

3x 繰り返される数字の最初のインスタンスのインデックスを見つけ、そこから [index, 2] を切り出すことを含む厄介なトリックを除いて、私は途方に暮れています。もっと「ルビーに似た」方法が必要です。

ありがとう!

4

2 に答える 2

1

これにより、= 2 である最初の 3 つの要素が削除されます。

3.times{a.index(2)? a.delete_at(a.index(2)) : nil }

配列内の数字の最初の 3 桁を削除する場合は、次のようにします。

(0..9).each{|n| 3.times{a.index(n)? a.delete_at(a.index(n)) : nil }}

-修飾子を使用してさらに変更された Matt のバージョンif:

(0..9).each{|n| {3.times{a.delete_at(a.index(n))} if a.count(n) >= 3}
于 2011-06-30T11:53:49.303 に答える
0

アイテムをどのように表示するかはわかりませんが、使用する場合の簡単なオプションは次のとおりです。

a = [2, 2, 2, 1, 2]
a.last(2) => [1,2]
a.uniq => [1,2]
于 2011-06-30T11:59:47.920 に答える