加重平均-押し上げ傾向の問題


10

この配列が、過去28日間に毎日達成したプレスアップの数だとしましょう。

[
  20,20,20,30,30,30,30,
  35,35,40,40,40,45,45,
  50,50,50,50,50,50,50,
  60,70,80,90,100,110,120
]

ご覧のように、先週は急激な上昇傾向にあり、これがこのデータの中で最も興味のある部分です。過去のデータが多いほど、「平均」でそのデータを取り上げる必要が少なくなります。 '腕立て伏せの数。

そのために、前週よりも各週の価値が高い「平均」を算出したいと思います。


この問題の一部ではなく、背景情報。

通常の平均:

すべての値の合計/値の数

上記の場合:

1440/28 = 51.42857142857143


加重平均:

アレイを7つの4つのグループに分割し、新しいアレイを起動します。

  • 最初のグループを配列に追加します。
  • 2番目のグループをアレイに2回追加します。
  • 3番目のグループを3回配列に追加します。
  • 4番目のグループを配列に4回追加します。

長さで新しい配列の全て、及び分割を合計新しいアレイ。

上記の場合:

配列をこれに変換します:

[
  20,20,20,30,30,30,30, # first week once
  35,35,40,40,40,45,45, 
  35,35,40,40,40,45,45, # second week twice
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50, # third week thrice
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120 # Fourth week four times
]

次に、そのアレイで通常の平均を実行します。

4310/70 = 61.57142857142857

先週の上昇傾向のため、通常の平均値よりも高いことに注意してください。


ルール:

  • 入力は28の非負整数のフラット配列です。
  • 書きたい言語。
  • 数値を出力します。
  • 私はいつもTIOリンクを見たいです。
  • 最小のバイト数で問題を解決してください。
  • 結果は、小数点以下4桁までの精度の小数(切り捨てても、テストケースの値から切り上げても問題ありません)または正確な小数でなければなりません。

テストケース:

ケース1:上昇傾向

[
  20,20,20,30,30,30,30,
  35,35,40,40,40,45,45,
  50,50,50,50,50,50,50,
  60,70,80,90,100,110,120
]

通常平均:51.42857142857143加重平均:61.57142857142857

ケース2:落ち着きを残す

(私は悪い週を過ごしましたが、それは少し前のことでした)

[
  50,50,50,50,50,50,50,
  10,10,10,10,10,10,10,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50
]

通常平均:40加重平均:42

ケース3:あきらめる

私は悪い週を過ごしました、それは私の平均を速く引き下げています。

[
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  10,10,10,10,10,10,10
]

通常平均:40加重平均:34

ケース4:平均化

さて、ここで遊んでいるだけなので、通常の平均と加重平均の値は同じかもしれないと思いましたが、もちろんそうではありませんでした。

[
  60,60,60,60,60,60,60,
  30,30,30,30,30,30,30,
  20,20,20,20,20,20,20,
  15,15,15,15,15,15,15
]

通常平均:31.25加重平均:24.0


ボーナス問題:

28の値のどの組み合わせが同じ通常の平均と加重平均を持つでしょうか?


幸せなゴルフ!



1
あなたも指数平滑法を試してみたいかもしれません- new_avg = α*weekly_sum + (1-α)*old_avgいくつかのためにα∈(0,1)
Angs

2
私は0毎日腕立て伏せをしているので、私の加重平均は私の通常の平均と同じです。
Neil、

@ニールあなたは加重平均システムから利益を得ないでしょう;)
AJFaraday

1
過度のトレーニングをしないように注意してください:p
ブライアンH.

回答:




5

05AB1E8 7バイト

Xcoder氏のお陰で1バイト節約

7ô.s˜ÅA

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

説明

7ô         # split list into groups of 7
  .s       # push suffixes
    ˜      # flatten
     ÅA    # arithmetic mean

@ Mr.Xcoder:ええ、私は平均的な関数を見たことがあることを知っていましたが、それを見つけることができませんでした:P
Emigna

4

ゼリー、7バイト

s7ṫJFÆm

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

使い方

s7ṫJFÆm  Main link. Argument: A (array of length 28)

s7       Split the array into chunks of length 7.
   J     Indices; yield [1, ..., 28].
  ṫ      Tail; yield the 1st, ..., 28th suffix of the result to the left.
         Starting with the 5th, the suffixes are empty arrays.
    F    Flatten the resulting 2D array.
     Æm  Take the arithmetic mean.

ええと、これx"J$ṫJこのコンテキストでは同等です。面白い!
氏Xcoder

ちょっと。n番目の配列の要素をn回繰り返す代わりに、これはすべてのサフィックスを取ります。平坦化後、同じ要素を生成しますが、順序は異なります。
デニス

4

R + pryr、32 28バイト

週平均のスコアが同じであれば、平均は等しくなります。

pryr::f(s%*%rep(1:4,e=7)/70)

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

Giuseppeのおかげで、ドット積を使用して4バイトを節約しました。

純粋なRは、次の2バイトを使用します。 function


もちろん、それは明白ですが、今はそれについて考えています。
AJFaraday、2018年

1
代わりにドット積を使用して28バイトsum
Giuseppe

私は40バイトを持っていましたfunction(s)weighted.mean(s,rep(1:4,e=7))
ジュゼッペ

1
@Giuseppe幸いにも私は覚えていませんでしたweighted.meanR外出するときにそれを愛するPython
JayCe

4

MATL、10バイト

7es4:*s70/

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

私は年齢でMATLの回答を投稿していません。2018年5月LOTMの一部として参加する可能性があると考えました。

説明:

7e          % Reshape the array into 7 rows (each week is one column)
  s         % Sum each column
   4:       % Push [1 2 3 4]
     *      % Multiply each columnar sum by the corresponding element in [1 2 3 4]
      s     % Sum this array
       70/  % Divide by 70

K:7Y"*s70/も10バイトでした。
ジュゼッペ

3

ゼリー、9 バイト

s7x"J$FÆm

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

使い方

s7x "J $FÆm–最初のコマンドライン引数から入力を受け取り、STDOUTに出力します。
s7 – 7のグループに分割。
   "–ベクトル化(zipwith)を適用:
  x J $ –各リストの要素をリストのインデックスと同じ回数繰り返します。
      F –フラット化。
       Æm–算術平均。

2

Haskell、35バイト

(/70).sum.zipWith(*)([1..]<*[1..7])

ボーナス:a,b,c,d毎週の合計の場合、通常の平均は加重平均と同じです:

(a + b + c + d)/4 = (a + 2b + 3c + 4d)/10  <=>
10(a + b + c + d) = 4(a + 2b + 3c + 4d)    <=>
5(a + b + c + d)  = 2(a + 2b + 3c + 4d)    <=>
5a + 5b + 5c + 5d = 2a + 4b + 6c + 8d      <=>
3a + b - c - 3d   = 0

1つの解決策は、最初の週と最後の週の合計が同じで、同様に2週目と3週目の合計が同じ場合ですが、上腕二頭筋がそれまでなら、無限に多くの解決策があります。例:[15,10,10,10,10,10,5,20,20,20,25,25,20,20,30,20,20,20,20,20,20,10,10,20 、0、10、10、10]

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


2

JavaScript(Node.js)、49バイト

a=>a.map((x,i)=>(I+=d=-~(i/7),s+=x*d),s=I=0)&&s/I

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


非ジェネリックソリューション

JavaScript(Node.js)39 36バイト

a=>a.reduce((s,x,i)=>s+x*-~(i/7))/70

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


1
を使用した最初のソリューションでは-1バイトa=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I。そして簡単なヒント:<hr>
Herman L

@HermanL使用の何が問題になってい---ますか(独自の段落が必要です)?
Neil、


2

スタックス10 8 バイト

äΔ6◙█µøΓ

実行してデバッグする

説明(開梱):

7/4R:B$:V Full program, implicit input
7/        Split into parts of length 7
  4R      Push [1, 2, 3, 4]
    :B    Repeat each element the corresponding number of times
      $   Flatten
       :V Average

1
別のスタックスを使用!はい!を使用$して、要素がすべて整数の場合にフラット化できます。今すぐOPで確認してください。
Khuldraeseth na'Barya


2

チャコール、14バイト

I∕ΣE⪪A⁷×Σι⊕κ⁷⁰

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

     A          Input array
    ⪪ ⁷         Split into subarrays of length 7
   E            Loop over each subarray
         ι      Subarray
        Σ       Sum
           κ    Loop index
          ⊕     Incremented
       ×        Product
  Σ             Sum results
            ⁷⁰  Literal 70
 ∕              Divide
I               Cast to string
                Implicitly print

2

K4 / K(OK)19 16 14バイト

解決:

+/(1+&4#7)%70%

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

例:

+/(1+&4#7)%70%50 50 50 50 50 50 50 10 10 10 10 10 10 10 50 50 50 50 50 50 50 50 50 50 50 50 50 50
42

説明:

評価は右から左に行います。7 1s、7 2s、7 3sおよび7 4sを入力で割った70で割ります。次にまとめます。

+/(1+&4#7)%70% / the solution               
           70% / 70 divided by the input
  (      )%    / the stuff in brackets divided by this...
      4#7      / draw from 7, 4 times => 7 7 7 7
     &         / 'where' builds 7 0s, 7 1s, 7 2s, 7 3s
   1+          / add one
+/             / sum (+) over (/) to get the total

2

Excel:33バイト

(A1:N1とA2:N2から2行でデータを実行することにより、@ wernischの回答から3バイト節約)

=AVERAGE(A1:N2,H1:N2,A2:N2,H2:N2)

これをコメントとして含めなかったことをお詫びします。私にはそうするのに十分な評判がありません。



1

Triangularity、49バイト

....)....
...D7)...
..14)21..
.WM)IEtu.
}u)70s/..

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

説明

)D7)14)21WM)IEtu}u)70s/ – Full program.
)D7)14)21               – Push the literals 0, 7, 14, 21 onto the stack.
         WM     }       – Wrap the stack to a list and run each element on a separate
                          stack, collecting the results in a list.
           )IEt         – Crop the elements of the input before those indices.
               u        – Sum that list.
                 u      – Then sum the list of sums.
                  )70   – Push the literal 70 onto the stack.
                     s/ – Swap and divide.


1

APL + WIN、13バイト

整数のベクトルとしての配列のプロンプト:

(+/⎕×7/⍳4)÷70

説明:

7/⍳4) create a vector comprising 7 1s, 7 2s, 7 3s and 7 4s

+/⎕× prompt for input, multiply by the vector above and sum result

(....)÷70 divide the above sum by 70

1

Java 8、57バイト

a->{int r=0,i=35;for(;i-->7;)r+=i/7*a[i-7];return r/70d;}

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

説明:

a->{              // Method with integer-array parameter and double return-type
  int r=0,        //  Result-sum, starting at 0
      i=35;       //  Index-integer, starting at 35
  for(;i-->7;)    //  Loop `i` downwards in the range (35,7]
    r+=           //   Add the following to the result-sum:
       i/7        //    `i` integer-divided by 7,
       *a[i-7];   //    multiplied by the item at index `i-7`
  return r/70d;}  //  Return the result-sum, divided by 70.0


1

Clojure、48 46バイト

#(/(apply +(for[i[0 7 14 21]v(drop i %)]v))70)

これは、mapcat + subvecの組み合わせよりも短くなりました。


1

TI-Basic、25バイト

mean(Ansseq(sum(I>{0,7,21,42}),I,1,70

代替ソリューション、39バイト

Input L1
For(I,1,70
Ans+L1(I)sum(I>{0,7,21,42
End
Ans/70


1

Excel、36 33バイト

@tshのおかげで-3バイト。

=SUM(1:1,H1:AB1,O1:AB1,V1:AB1)/70

最初の行(A1AB1)に入力します。


多分A1:AB1-> 1:1
tsh

1

ジュリア0.6、27バイト

p->repeat(1:4,inner=7)'p/70

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

repeatコールは、など、その後7 1の、7 2の、私たちは、その後でそれを移調含む、28個の値の列の行列を形成し'、その後入力して行列の乗算を行うと、(mutiplicationはここに暗黙的です)。これは1x28行列と28x1行列の行列乗算なので、必要な加重和である単一の値になります。それを除算し70て加重平均を求めます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.