2016-08-31 7 views
1

とする。initial_array = (1..10).to_a配列から要素とその周囲の要素を選択するにはどうすればいいですか?

数値選択ではダイナミックにする必要がありますが、例の場合は数字5と両側の2つの要素を選択する必要があります。理想的には、これは[3,4,5,6,7]を返します。

私は、each_consを使用して、周囲の数字で希望する配列の長さを返すことができます。ただし、希望の要素を選択するには、現在initial_array.each_cons(5).find {|ary| ary.include?(5)}を使用しています。

これは、[3,4,5,6,7]ではなく[1,2,3,4,5]を返します。

initial_array.length < 5、その時点でreturned_array.length == intial_array.lengthを除き、返された配列は常に長さ5で、スペクトルの両端で機能するようにしたいと思います。

したがって、initial_array.solution_method(1)戻り[1,2,3,4,5]

initial_array.solution_method(10)戻り[6,7,8,9,10]

[1,2,3,].solution_method(2)戻る[1,2,3]

答えて

2

これは1つのライナーではなく、わかりやすいかもしれませんか?

input = (1..10) 

def select_range(array, num, range) 
    index = array.index(num) # find the value 
    return [] if !index # return if the array doesn't include it 

    array[(index - range)..(index + range)] # return the range of elements 
end 

p select_range(input.to_a, 5, 2) 

出力:

[3, 4, 5, 6, 7] 
+0

アレイの中央には最適です!しかし、 'num <= 2'ならば、戻り配列の負のインデックスのために' [] 'を返します。 'num> = 9'の場合、' array [index + range] 'が存在しないので、より短い配列を返します。 – ReidasaurusRex

+0

配列境界外の範囲に対する期待値は何ですか?切り詰めますか?最後に正確に範囲の長さである必要がありますか?ここでは、より多くのコードを記述する前に定義する必要がある場合があります。 – Anthony

+0

編集時に対処しようとしました。 return_ary.length == init_ary.length <5の場合の文字列 – ReidasaurusRex

2
def grab_part(arr, nbr, option=:avg) 
    return nil unless (1..arr.size).include?(nbr) 
    return nil if option!=:avg && !(nbr-1...arr.size).include?(option) 
    first = (option==:avg) ? (arr.size-nbr)/2 : option-nbr+1 
    arr[first,nbr] 
end 

nbr返される配列のサイズです。 arrの "middle"が返される場合はoption==:avg、 else optionは、返される配列の最後の要素を示すarrへのインデックスです。

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

grab_part(arr,5) #=> [3, 4, 5, 6, 7] 
grab_part(arr,5,9) #=> [6, 7, 8, 9, 10] 
grab_part(arr,5,4) #=> [1, 2, 3, 4, 5] 

次に、grab_partという2番目のパラメータの他の値の戻り値を示します。

(1..arr.size).map do |n| 
    next if n==5 
    puts "grab_part(arr,#{n}) \#=> #{ grab_part(arr,n) }" 
    puts "grab_part(arr,#{n},#{arr.size-1}) \#=> #{grab_part(arr,n,arr.size-1)}" 
    puts "grab_part(arr,#{n},#{n-1}) \#=> #{grab_part(arr,n,n-1)}\n" 
end 
grab_part(arr,1) #=> [5] 
grab_part(arr,1,9) #=> [10] 
grab_part(arr,1,0) #=> [1] 
grab_part(arr,2) #=> [5, 6] 
grab_part(arr,2,9) #=> [9, 10] 
grab_part(arr,2,1) #=> [1, 2] 
grab_part(arr,3) #=> [4, 5, 6] 
grab_part(arr,3,9) #=> [8, 9, 10] 
grab_part(arr,3,2) #=> [1, 2, 3] 
grab_part(arr,4) #=> [4, 5, 6, 7] 
grab_part(arr,4,9) #=> [7, 8, 9, 10] 
grab_part(arr,4,3) #=> [1, 2, 3, 4] 
grab_part(arr,6) #=> [3, 4, 5, 6, 7, 8] 
grab_part(arr,6,9) #=> [5, 6, 7, 8, 9, 10] 
grab_part(arr,6,5) #=> [1, 2, 3, 4, 5, 6] 
grab_part(arr,7) #=> [2, 3, 4, 5, 6, 7, 8] 
grab_part(arr,7,9) #=> [4, 5, 6, 7, 8, 9, 10] 
grab_part(arr,7,6) #=> [1, 2, 3, 4, 5, 6, 7] 
grab_part(arr,8) #=> [2, 3, 4, 5, 6, 7, 8, 9] 
grab_part(arr,8,9) #=> [3, 4, 5, 6, 7, 8, 9, 10] 
grab_part(arr,8,7) #=> [1, 2, 3, 4, 5, 6, 7, 8] 
grab_part(arr,9) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
grab_part(arr,9,9) #=> [2, 3, 4, 5, 6, 7, 8, 9, 10] 
grab_part(arr,9,8) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
grab_part(arr,10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
grab_part(arr,10,9) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

さらにいくつか。

grab_part(arr,5,6) #=> [5, 6, 7, 8, 9] 
    #=> [3, 4, 5, 6, 7] 
grab_part(arr,5,8) #=> [3, 4, 5, 6, 7] 
    #=> [5, 6, 7, 8, 9] 
grab_part(arr,5,3) #=> [5, 6, 7, 8, 9] 
    #=> nil 
grab_part(arr,5,10) #=> [3, 4, 5, 6, 7] 
    #=> nil 
+0

オプションに対処するはずだったのですか?私はあなたが何かを持っていると確信している、ちょうど相関を見ていない。 '1 <= option > = 4'が返された配列を切り捨てています – ReidasaurusRex

+0

Rex、はい。私は明確にしようとしました。 –

1

タスクを実行するには、sliceメソッドを使用できます。ちょうどfyi、(1..10)は配列ではなく範囲オブジェクトです。 sliceメソッドを使用するには、範囲を最初に配列に変更する必要があります(1..10).to_a

sliceは、開始インデックスと長さの2つの入力を取ります。だからあなたはを取得する[3,4,5,6,7]

+1

彼は開始インデックスがどこにあるのかわからないので、これを完了するためにここで行うべきより多くの仕事があります。 – Anthony

+0

申し訳ありませんが、最初の投稿では明確ではありませんでした。目標とする数字を動的にする必要があります。ターゲット番号を知っていて、その番号が配列のどこにあるのかはわかります。しかし、配列の後の番号を対象にしようとすると、より困難になります。 'first input> 5'の場合、配列を切り捨てます – ReidasaurusRex

0

私の現在の作業の解決策です。私が望むほど雄弁ではありませんが、私が探しているものには効果的です。

def grab_neighbors(array, num, range) 
    index = array.index(num) 
    target_length = range * 2 + 1 
    if index < range 
    return array.slice(0, target_length) 
    elsif index >= (array.length - range) 
    return array.slice(-target_length, target_length) 
    else 
    return array[(index - range)..(index + range)] 
    end 
end