20146


例えばインデックス表す式を`3n-2`としたときに、その式に適合するインデックスの要素だけを配列から抜き出したいといった場合があります。

[code]

    (概念的にはこんな感じ)
    [a,b,c,d,e,f,g]  => [b,e] ※ 1 <= n <= 2 のとき
    
[/code]

最初は以下のようなものを考えてみたのですが、これだと`n`の範囲をあらかじめ分かっていないと使えません。

[code]

    a = [:a, :b, :c, :d, :e, :f, :g]
    b = []
    1.upto(2){|n| b << a[n * 3 - 2]}
    #=> 1
    b.compact
    #=> [:b, :e]
    
[/code]

泥臭いやり方でも、スマートなやり方でも、どちらでも良いので、`n`の範囲をあらかじめ考えずともできる方法を探しているのですが思いつきません。  
[言語リファレンス](http://docs.ruby-
lang.org/ja/2.2.0/library/_builtin.html)を見ながら考えてはみたのですが、試しているうちに混乱してしまいました。  
初歩的な質問かもしれませんが、どなたか良い解法がありましたら教えてください。


CC BY-SA 3.0
2015-12-18T02:03:01.047
20129
2015-12-18T12:59:36.947
2015-12-18T02:43:17.170
9403
9403
question
ruby
配列から特定式で表したインデックスの要素だけを抜き出す方法


方法は色々有ると思います、一例として

[code]

    a = [*'a'..'g'].each_with_index.select{ |e,i| i % 3 == 1}.map{|e| e[0]}
    p a #["b", "f"]
    
[/code]

説明：  
`each_with_index` で要素とインデックスを得られるので、  
それから条件で`select`して  
`map`で要素だけに戻す処理です。


CC BY-SA 3.0
2015-12-18T02:24:31.353
20132
2015-12-18T02:43:31.587
2015-12-18T02:43:31.587
5044
5044
20129
answer

[code]

      a = [:a,:b,:c,:d,:e,:f,:g]
      n_range = 1..2
      a.select.with_index {|_v, index|
        n_range.any? {|n| (3 * n - 2) == index }
      }
    
[/code]


CC BY-SA 3.0
2015-12-18T02:24:41.743
20133
2015-12-18T12:59:36.947
2015-12-18T12:59:36.947
2599
2599
20129
answer


@BLUEPIXY さんとほぼ同案ですが、`.with_index` を使ってもう少しシンプルに。

[code]

    b = a.select.with_index { |x, i| i%3 == 1 }
    # => [:b, :e]
    
[/code]


CC BY-SA 3.0
2015-12-18T05:53:42.807
20146
2015-12-18T05:53:42.807
76
20129
answer