Середньозважене - проблема тенденції тиску


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


Середнє зважене:

Розділіть масив на 4 групи з 7 та запустіть новий масив.

  • Додайте першу групу до масиву.
  • Додайте другу масу до масиву двічі.
  • Додайте третю групу до масиву тричі.
  • Додайте четверту групу до масиву чотири рази.

Підсумовуйте весь новий масив і діліть на довжину нового масиву.

Для вище:

Перетворити масив у це:

[
  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
Брайан Х.

Відповіді:


3

Лушпиння , 6 байт

AΣΣṫC7

Спробуйте в Інтернеті!

Використовує хитрість, яку Денніс використовував, щоб перевершити моє уявлення про Джеллі. Замість того, щоб повторювати кожен шматок N разів, він отримує суфікси списку фрагментів, які після вирівнювання дадуть такий же результат, крім порядку.



5

05AB1E , 8 7 байт

Збережено 1 байт завдяки панові Xcoder

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)

Спробуйте в Інтернеті!

Збережено 4 байти, використовуючи крапковий продукт завдяки Джузеппе .

У чистого R буде використано ще два байти function


Звичайно, так, це очевидно, зараз я думаю про це.
AJFaraday

1
28 байт, використовуючи крапковий продукт замістьsum
Джузеппе

У мене було 40 байтfunction(s)weighted.mean(s,rep(1:4,e=7))
Джузеппе

1
@Giuseppe На щастя я не згадав weighted.mean. Любіть, коли Rперевершує Python.
JayCe

4

MATL , 10 байт

7es4:*s70/

Спробуйте в Інтернеті!

Я не опублікував відповідь MATL у віках! Подумав, що я можу брати участь у рамках LOTM травня 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,10,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>для створення горизонтальної лінії в розмітці
Герман Л

@HermanL Що не так з використанням ---(потрібен власний параграф)?
Ніл


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
Ще один, використовуючи Stax! Так! Ви можете використовувати $для вирівнювання, якщо всі елементи є цілими числами - перевірити за допомогою 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 байти

(3 байти, збережені з відповіді @ wernisch, шляхом запуску даних у 2 рядках від A1: N1 та A2: N2)

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

Вибачте за те, що не включите це як коментар. У мене недостатньо репутації для цього.


2

Japt , 11 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

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

Рубін , 65 байт

->r{(b=(0..r.size/7).map{|a|r[a*7..-1]}.flatten).sum/b.size.to_f}

Спробуйте в Інтернеті!


Тут вказується розмір введення, який має бути зафіксований на рівні 28, тому ви можете зберегти кілька байтів шляхом жорсткого кодування значень замість використання sizeвластивості. Спробуйте в Інтернеті!
sundar

1

Excel, 36 33 байт

-3 байти завдяки @tsh.

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

Введіть у перший рядок ( A1до AB1).


Можливо A1:AB1-> 1:1?
тш

1

Джулія 0,6 , 27 байт

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

Спробуйте в Інтернеті!

repeatВиклик утворює матрицю - стовпець 28 значень, що містить сім 1, а потім сім 2 - х і т.д. Потім ми транспонувати її ', а потім зробити матричне множення з входом (mutiplication мається на увазі тут). Оскільки це матричне множення матриці 1x28 з матрицею 28x1, ми закінчуємо єдиним значенням, яке є зваженою сумою, яка нам потрібна. Розділіть це на, 70щоб отримати нашу середню зваженість.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.