一連の課題#3:移動平均


16

注:これは、一連の課題の3 番目です。前のチャレンジについては、ここをクリックしてください

リストの移動平均

リストの移動平均は、元の小さな重複サブリストを平均化することによって作成された、新しい平滑化されたリストを生成する計算です。

移動平均を作成するとき、特定の「ウィンドウサイズ」を使用して重複するサブリストのリストを最初に生成し、このウィンドウを毎回右にシフトします。

たとえば、リスト[8, 4, 6, 2, 2, 4]とウィンドウサイズを指定する3と、サブリストは次のようになります。

[8,  4,  6,  2,  2,  4]          Sublists:
(         )                  <-  [8, 4, 6]
    (         )              <-  [4, 6, 2]
        (         )          <-  [6, 2, 2]
            (         )      <-  [2, 2, 4]

次に、各サブリストの平均値を計算して結果を取得します[6.0, 4.0, 3.3, 2.7](各値は小数点以下1桁に丸められます)。


チャレンジ

あなたの仕事は、リストLおよび整数1≤n≤length(L)が与えられ、ウィンドウサイズnを使用してLの移動平均を計算するプログラムまたは関数を書くことです。

ルール:

  • プログラムでは、整数除算または浮動小数点除算を使用できます。浮動小数点除算の場合、値がそれ以外の場合に正しい限り、データ型の制限によるわずかな不正確さが許可されます。
  • 完全なプログラムまたは機能を送信できます(スニペットは送信できません)。
  • リストには正の整数のみが含まれると想定できます
  • 標準的な抜け穴は禁止されています。
  • これはなので、最短の回答(バイト単位)が勝ちです!

テストケース

読みやすくするために、すべての値は小数点以下1桁に丸められていることに注意してください。

n=5, [1, 2, 3, 4, 5, 6, 7, 8]      ->      [3, 4, 5, 6]
n=3, [100, 502, 350, 223, 195]     ->      [317.3, 358.3, 256]
n=1, [10, 10, 10]                  ->      [10, 10, 10]
n=3, [10, 20, 30]                  ->      [20]
n=2, [90, 40, 45, 100, 101]        ->      [65, 42.5, 72.5, 100.5]

float値を丸める必要がありますか、それともそのままにしておくことができますか?
コイナーリンガーリング

3
@cairdcoinheringaahing 読みやすくするために、すべての値が小数点以下1桁に丸められていることに注意してください。私の意見では、あなたは間違いなくそれらをそのままにしておくことができます(少なくともそれは私が理解していることです)。
ミスターXcoder

@cairdcoinheringaahing I / Oについてはかなり寛大です:整数値または浮動小数点値は問題ありません。必要なら丸めてもかまいません。浮動小数点エラーは許可されます
FlipTack

浮動小数点数の代わりに小数を返すことはできますか?
ジョンファンミン

@JungHwanMin正確性のために、言語が浮動小数点数ではなく分数として値を保存する場合、最も単純な形式で正確な分数として値を印刷するのは問題ありません。
FlipTack

回答:



7

Wolfram言語(Mathematica)、13バイト

Mathematicaにはすべての機能が組み込まれています

MovingAverage

オンラインでお試しください!

リストを取得してから半径を取得します...


6
MovingAverageಠ_____ಠ私はこれを信じることを拒否
氏Xcoder

@cairdcoinheringaahing数値を受け取ります。MovingAverage分数のセットを返します。OPで許可されたので、これMovingAverageで十分です。
ミスターXcoder


7

Dyalog APL、4バイト

@Grahamのおかげで1バイト節約

@ jimmy23013のおかげで2バイト節約

APLはゴルフの言語ではないことを述べましたか?

⊢+/÷

n右に、または

+/÷⊣

L右側に。

オンラインでお試しください!

どうやって?

÷-分割Lによってn

⊢+/-の+ウィンドウで削減n


還元前にLをnで除算しないのはなぜですか。バイト保存
グラハム


または+ /÷⊣
jimmy23013

@ jimmy23013ありがとうございます!私は以前にそれを試しましたが、引数を間違って入力したに違いないので、うまくいきませんでした。
ウリエル



4

Perl 6、33バイト

{@^a.rotor($^b=>1-$b)».sum X/$b}

試して

拡張:

{  # bare block with placeholder parameters 「@a」, 「$b」

  @^a                # declare and use first param

  .rotor(            # split it into chunks
    $^b              # declare and use second param
    =>               # pair it with
    1 - $b           # one less than that, negated

  )».sum             # sum each of the sub lists

  X/                 # cross that using &infix:«/»

  $b                 # with the second param
}


4

J、7 5バイト

]+/\%

オンラインでお試しください!

n右側の引数として、リストを左側として取ります。中置の合計のみを行うというアイデアに対するUrielのソリューションの功績です。

説明

]+/\%
    %  Divide list by n
]+/\   Sum on overlapping intervals of size n

以前のソリューション(7バイト)

(+/%#)\
      \  Apply to overlapping intervals of size n
(+/%#)   Mean
 +/        Sum
   %       Divided by
    #      Length




2

R、72バイト

function(l,n)(k=sapply(0:sum(l|1),function(x)mean(l[x+1:n])))[!is.na(k)]

オンラインでお試しください!

meanすべてのサイズのnウィンドウを計算します。ウィンドウがの端を通過するlと、結果がNAフィルタリングされます。

R +動物園パッケージ、13バイト

zoo::rollmean

zooパッケージ(規則及び不規則時系列のためのS3インフラストラクチャは)便利な機能をたくさん持っています。こちら(R-fiddle)で試すことができます。


2

Japt v2.0a0、7バイト

ãV ®x÷V

それを試してみてください


説明

配列Uと整数の暗黙的な入力V

ãV

のサブセクションを取得UしますV

®

サブセクションにマップします。

÷V

各要素をで除算しVます。

x

すべての要素を合計します。









0

JavaScript(ES6)、53バイト

(l,n)=>l.map(e=>(s+=e-=a[i-n]||0)/n,s=i=0).slice(n-1)





0

K(oK)13 11バイト

解決:

{+/+x':y%x}

オンラインでお試しください!

例:

{+/+x':y%x}[3;8 4 6 2 2 4]
6 4 3.3333 2.6667
{+/+x':y%x}[5;1 2 3 4 5 6 7 8]
3 4 5 6

説明:

oK スライディングウィンドウを作成するためのビルトインがあり、結果の配列を合計し、スライディングウィンドウサイズで除算して平均を求めます。

{+/+x':y%x} / the solution
{         } / lambda function taking x and y as implicit parameters
       y%x  / y (list) by x (sliding array size)
    x':     / sliding window of size x over list y
   +        / flip array (rotate by 90 degrees)
 +/         / sum up array

あなた+フリップ配列を必要としない、そしてKはAPLのような通勤を持っている場合は、移動することができますように見えるx%[commute]左へと括弧をドロップ
ウリエル

合計が各リストの下ではなく全体にあることを確認するためにフリップが必要であり、通勤オペレーターがいないこと、少なくともマニュアルでそれを示唆するものが少なくともないことをかなり確認します。乾杯!
ストリートスター

0

DataWeave、50バイト

fun s(l,w)=0 to(sizeOf(l)-w)map avg(l[$ to $+w-1])
%dw 2.0
output application/json

fun sma(list: Array<Number>, window: Number) =
  0 to (sizeOf(list) - window)  // generate starting indices of sublists
  map list[$ to $ + window - 1] // generate sublists
  map avg($)                    // calculate averages

---
sma([90, 40, 45, 100, 101], 2)


0

Java 8、111バイト

a->n->{int l=a.length-n+1,i=0,j;float[]r=new float[l];for(;i<l;r[i++]/=n)for(j=i;j<i+n;r[i]+=a[j++]);return r;}

説明:

ここで試してみてください。

a->n->{                 // Method with array and int parameters and float-array return-type
  int l=a.length-n+1,   //  New length of the return-array
      i=0,j;            //  Index-integers
  float[]r=new float[l];//  Return-array
  for(;i<l;             //  Loop (1) from 0 to `l` (exclusive)
      r[i++]/=n)        //    After every iteration, divide the current item by input `n`
    for(j=i;j<i+n;      //   Inner loop (2) from `i` to `i+n` (exclusive)
      r[i]+=a[j++]      //    Sum the result at index `i` with the items of the input-array
    );                  //   End of inner loop (2)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the resulting float-array
}                       // End of method
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.