2017-10-07 15 views
1

私はカタで作業しています。リストlstと数字Nが与えられている場合、lstの各要素が最大でN回の順序で並べ替えられない新しいリストを作成しています。 N = 2たとえば、入力が[1,2,3,1,2,1,2,3]ですが、私はこれは[1,2,3,1,2,3]につながる、その結果に3回あること12につながり、その後、3がかかりますので、[1,2]次を落とし、[1,2,3,1,2]を取ります。ここで 条件を満たす配列の最後に一致する要素を削除します。

def delete_nth(order,max_e) 
    #your code here 
    order.any? do |element| 
    if order.count(element) > max_e 
     order.delete_at(order.index(element)) 
    end 
    end 
    order 
end 

が出力されます:

は、ここに私のコードです。配列から

[20,37,20,21]、1あなたが得る - 期待:代わりに[20、37、21]、 が得た:[37、20、21]

それ配列内のその基準を満たす最初の要素を消去し、最後の要素を削除する必要があります。

答えて

3

@Steenslagと@Stefanは、元の回答と同じ改善(示唆は異なっていますが)を提案しました。私はその改善を組み込むために私の答えを編集しました。

コード

def doit(arr, n) 
    h = Hash.new(0) 
    arr.select { |e| n >= h[e] += 1 } 
end 

arr = [1,2,3,1,2,1,2,3] 
n = 2 
doit arr, n 
    #=> [1, 2, 3, 1, 2, 3] 

説明

例でarrnの値に対して実行されるステップをf通りでありますollows。

h = Hash.new(0) 

Hash::newの形式です。これはデフォルト値(ここではゼロ)をとります。つまり、すべてはhがキーk持っていない上で定義されている場合、デフォルト値が返されることです。

h['cat'] #=> 0 

これは、ハッシュは変更されません。 h[:a] = 1と書くと(h=>{:a=>1})、h[:a]h:aのキーがあるので、1を返します。続いて、

enum = arr.reject 
    # => #<Enumerator: [1, 2, 3, 1, 2, 1, 2, 3]:reject> 

最初の値はenumによって生成されたブロックに渡され、ブロック変数は、その値が割り当てられています。

e = enum.next 
    #=> 1 

ブロック演算について今

h #=> { 1=>1 } 

arrの最初の要素が選択された

2 >= h[1] 
    #=> true 

のでそう

h[e] += 1 
    #=> h[e] = h[e] + 1 
    # h[e] = 0 + 1 = 1 

行われます。

h[1] = h[1] + 1については、注意すべき点が2つあります。まず、hには1というキーがないため、等価の右側にあるh[1]はデフォルト値の0を返します。次に、デフォルト値は、Hash#[]=(等号の左側)ではなく、Hash#[]というメソッドで使用されます。

enumという2番目の値がブロックに渡され、同様の計算が実行されます。

e = enum.next 
    #=> 2 
h[e] += 1 
    #=> h[2] = h[2] + 1 
    # h[2] = 0 + 1 
h #=> {1=>1, 2=>1} 
2 >= h[2] 
    #=> true 

だからarrの第二の要素は、選択されます。この時点

h = { 1=>2, 2=>2, 3=>1 } 

enum.next 
    #=> 3 
enum.next 
    #=> 1 
enum.next 
    #=> 2 

とブロックがenumによって生成された第1 5要素ごとにtruthy値を返しました:さんはenumによって生成された次の3つの要素をスキップしてみましょう。

次に、

e = enum.next 
    #=> 1 
h[e] += 1 
    #=> h[1] = h[1] + 1 
    # h[1] = 2 + 1 
h #=> {1=>3, 2=>2, 3=>1} 
2 >= h[1] 
    #=> 2 >= 3 => false 

ので、この値は、1が選択されていません。残りの計算は似ています。

+2

'arr.select {| e | (h [e] + = 1)<= n} ' – steenslag

+2

' arr.reject {| e | n Stefan

+0

多くのおかげで、@steenslagと... –

関連する問題