2017-02-18 6 views
-1
array=[6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5] 

要素が10の場合、配列の次の2つの値を取得し、10個に追加したい場合は、nilの値を削除しないでください。予想される出力は次のとおり整数の場合は配列に値を追加する

[6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5] 
+0

10の後にnil以外の値が2つもない場合はどうすればよいですか? –

+0

単純なコードチャレンジを解決しようとしているだけで解決策を見つけるのが難しいため、このシナリオは方程式に含まれません。この挑戦は、私が書いたことを超えていません。 – olafsadventures

+0

質問が完全に指定されていないので、コードチャレンジが私の質問に答えたかどうかにかかわらず、あなたは(編集して)必要です。配列の最後の2つの要素のそれぞれが、10の場合は変更されない(2つの非nilsは従うことができないため)か、または次の最後の位置に10があり、最後の値が配列は非nilであり、後者は10に追加されるべきです。配列[10,10、nil、....、nil]を持つことさえできます。いずれか10を変更する必要がありますか?ルールが何であるかは関係ありませんが、ルールが必要です。 –

答えて

1

コード

def change_da_10s(arr) 
    nil_indices = arr.each_index.reject { |i| arr[i] } 
    arr.compact.concat([0, 0]). 
     each_cons(3). 
     map { |v| v.first == 10 ? v.sum : v.first }. 
     tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } } 
end 

arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5] 

change_da_10s(arr) 
    #=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5] 

説明

T彼は3つの主要なステップは次のとおりです。

nilのインデックスを保存します。

nil_indices = arr.each_index.reject { |i| arr[i] } 
    #=> [5, 11, 13] 

nil Sを削除末端に2つのゼロを追加し、正しい値に各トリプルをマッピングします。

a = arr.compact. 
     concat([0, 0]). 
     each_cons(3). 
     map { |v| v.first == 10 ? v.sum : v.first } 
    #=> [6, 2, 7, 1, 19,  9, 0, 8, 2, 23,  18,  3, 5, 7, 2, 5, 5] 

戻り値におけるギャップがnil sがあった場所を示すために過ぎません。

この計算には、次の手順が必要です。

arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5] 

b = arr.compact 
    #=> [6, 2, 7, 1, 10,  9, 0, 8, 2, 10,  10,  3, 5, 7, 2, 5, 5] 
c = b.concat([0, 0]) 
    #=> [6, 2, 7, 1, 10,  9, 0, 8, 2, 10,  10,  3, 5, 7, 2, 5, 5, 0, 0] 
e = c.each_cons(3) 
    #=> #<Enumerator: [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 0, 0] 
    # :each_cons(3)> 

我々はそれにEnumerable#entries(またはEnumerable#to_a)を呼び出すことによって、この列挙子によって生成される値を見ることができます。

e.entries 
    #=> [[6, 2, 7], [2, 7, 1], [7, 1, 10], [ 1, 10, 9], [10, 9, 0], [9, 0, 8], 
    # [0, 8, 2], [8, 2, 10], [2, 10, 10], [10, 10, 3], [10, 3, 5], [3, 5, 7], 
    # [5, 7, 2], [7, 2, 5], [2, 5, 5], [ 5, 5, 0], [5, 0, 0]] 

最後に、

e.map { |v| v.first == 10 ? v.sum : v.first } 
    #=> [6, 2, 7, 1, 19, 9, 0, 8, 2, 23, 18, 3, 5, 7, 2, 5, 5] 

Enumerable#sum RubyのV2.4でデビューしました。以前のバージョンではEnumerable#reduce(別名inject)を使用してください。

nilaに戻します。

a.tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } } 
    #=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5] 
+0

なぜ2つのゼロを最後に追加しましたか? – olafsadventures

+0

最後の位置に10がある場合、おそらく10になります.2つのゼロを追加することで、特別なケースとして扱う必要はありません。私は単純に '10 + 0 + 0'を計算します。同様に、配列が '[10、3]'で終わる場合、 '[10、3、0、0]'を使って '10 + 3 + 0'を計算することができます。もし配列が '[10、nil]'で終わっていれば '(10、0、0)'( 'nil'を取り除いた後)を使って' 10 + 0 + 0'を計算することができます。 'nil'が削除された後のトリプルの数は配列のサイズに等しいことに注意してください。これが' map'が適用される理由です。 –

+0

きちんとした、非常に便利です。 – olafsadventures

関連する問題