3

数値の配列xsがあり、その中の 3 つの連続するセクションの要素の合計を計算する必要があります。セクションはxs[0]で、xs[1, N]一部xs[N + 1, N]の整数はNです。たとえば、次の場合N = 2:

[1, 2, 3, 4, 5] #=> 1, 5, 9

私の実装は以下です。メモリ/速度をより効率的にすることはできませんでしたが、それでも気になります。今は他に何もすることがないと思いますが、これを行うためのよりエレガントで簡潔な方法があるでしょうか? 配列を作成する必要はありません。他の構造にすることができます。

xs.each_with_index.reduce([0, 0, 0]) do |m, x|
  v, i = x
  j = (i > N ? 2
       : i > 0 ? 1
       : 0)
  m[j] += v.to_i
  m
end
4

2 に答える 2

2
[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.reduce{|a,b|a+b}}

a.rb:

N = (rand * 1E6).to_i
xs = 1.upto(1E6).to_a

xs.each_with_index.reduce([0, 0, 0]) do |m, x|
  v, i = x
  j = (i > N ? 2
       : i > 0 ? 1
       : 0)
  m[j] += v.to_i
  m
end

b.rb:

N = (rand * 1E6).to_i
xs = 1.upto(1E6).to_a

[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.reduce{|a,b|a+b}}

時間:

$ time ruby a.rb 
ruby a.rb  0.85s user 0.01s system 99% cpu 0.860 total

$ time ruby b.rb 
ruby b.rb  0.29s user 0.01s system 99% cpu 0.296 total

ルビーのバージョン:

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]
于 2013-01-24T15:05:09.973 に答える
2

リトルバリアント:

[xs[0..0],xs[1..N],xs[N+1..-1]].map{|x|x.inject(:+)}
于 2013-01-24T15:41:04.047 に答える