加权平均-压力趋势问题


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组,然后启动一个新阵列。

  • 将第一个组添加到数组。
  • 将第二组添加到阵列两次。
  • 将第三组添加到数组三次。
  • 将第四组添加到阵列四次。

由长度总结所有的新阵列的,和除法阵列。

对于以上:

将数组转换为此:

[
  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 '18

1
小心不要过度训练:p
Brian H.

Answers:


3

外壳,6个字节

AΣΣṫC7

在线尝试!

使用Dennis超越我的Jelly提交的技巧。它不检索每个块N次,而是检索块列表的后缀,在平整化后将产生相同的结果(顺序除外)。



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 '18

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先生18年

有点。无需重复n次第n个数组的元素,而是使用所有后缀。展平后,它生成相同的元素,但顺序不同。
丹尼斯

4

R + pryr,32个 28字节

而每周相同的平均分数将导致均值相等。

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

在线尝试!

通过使用Giuseppe,使用点积节省了4个字节。

纯R将使用另外两个字节 function


当然,这很明显,现在我考虑一下。
AJFaraday

1
28个字节,使用点sum
Giuseppe,

我有40个字节,与function(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe,

1
@Giuseppe幸运的是我不记得了weighted.meanR郊游时喜欢它Python
JayCe '18年

4

MATL,10字节

7es4:*s70/

在线尝试!

我很久没发布MATL答案了!想我可能会参加LOTM May 2018

说明:

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

一种解决方法是,第一周和上周的总和相同,而第二周和第三周的总和也相同,但是如果您的二头肌达到要求,则有无限多个解决方案。例如:[15,10,10,10,10,10,5,20,20,20,25,25,20,20,30,20,20,20,20,20,20,20,10,10,20 ,0,10,10,10]

在线尝试!




2

Stax10 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
另一个用Stax!是! $如果元素都是整数,则可以用来展平-立即检查OP。
库尔德拉西斯·纳巴拉


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的两行上运行数据,从@wernisch的答案中节省了3个字节)

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

很抱歉没有将此内容纳入评论。我没有足够的声誉。


2

Japt11个10字节

xÈ/#F*ÒYz7

尝试一下


说明

 È             :Pass each element at index Y through a function
  /#F          :  Divide by 70
       Yz7     :  Floor divide Y by 7
      Ò        :  Negate the bitwise NOT of that to add 1
     *         :  Multiply both results
x               :Reduce by addition

1

三角性,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

J,16字节

70%~1#.]*7#4{.#\

说明:

              #\           finds the lengths of all successive prefixes (1 2 3 4 ... 28)
           4{.             takes the first 4 items (1 2 3 4)
         7#                creates 7 copies of each element of the above list
       ]*                  multiplies the input by the above 
    1#.                    sum
70%~                       divide by 70

在线尝试!


1

Clojure,48 46字节

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

最终比mapcat + subvec组合要短。


1

TI基本(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字节

-3个字节感谢@tsh。

=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调用形成一个包含28个值的列矩阵,包含七个1,然后七个7,'依此类推。然后将其与进行转置,然后与输入进行矩阵乘法(此处隐含了乘法)。由于它是1x28矩阵与28x1矩阵的矩阵乘法,因此我们得到一个单一值,这就是我们需要的加权和。除以70得到我们的加权平均值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.