Średnia ważona - problem trendu tłoczenia

10

Powiedzmy, że ta tablica pokazuje, ile pompek wykonałem każdego dnia w ciągu ostatnich 28 dni:

[
  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
]

Jak widać, w ubiegłym tygodniu wzrósł gwałtowny trend wzrostowy i właśnie tę część danych najbardziej mnie interesuje. Im dalej w przeszłości, tym mniej chcę, aby te dane pojawiały się w mojej „średniej” „liczba pompek.

W tym celu chcę wypracować „średnią”, w której każdy tydzień jest wart więcej niż w poprzednim tygodniu.


Informacje podstawowe, nie będące częścią tego problemu.

Normalna średnia:

Suma wszystkich wartości / liczba wartości

Powyżej:

1440/28 = 51,42857142857143


Średnia ważona:

Podziel tablicę na 4 grupy po 7 i uruchom nową tablicę.

  • Dodaj pierwszą grupę do tablicy.
  • Dodaj drugą grupę do tablicy dwa razy.
  • Dodaj trzecią grupę do tablicy trzy razy.
  • Dodaj czwartą grupę do tablicy cztery razy.

Zsumuj wszystkie nowe tablice i podziel przez długość nowej tablicy.

Powyżej:

Konwertuj tablicę na to:

[
  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
]

Następnie uruchom normalną średnią dla tej tablicy.

4310/70 = 61,57142857142857

Należy pamiętać, że jest wyższa niż normalna średnia wartość z powodu trendu wzrostowego w ostatnim tygodniu.


Zasady:

  • Dane wejściowe to płaska tablica 28 nieujemnych liczb całkowitych.
  • Dowolny język, w którym chcesz pisać.
  • Podaj liczbę.
  • Zawsze lubię widzieć linki do TIO .
  • Spróbuj rozwiązać problem przy użyciu jak najmniejszej liczby bajtów.
  • Wynik powinien być dziesiętny z dokładnością do co najmniej 4 miejsc po przecinku (skrócone lub zaokrąglone w górę od wartości przypadku testowego jest w porządku) lub dokładny ułamek.

Przypadki testowe:

Przypadek 1: Trend wzrostowy

[
  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
]

Normalna średnia: 51,42857142857143 Średnia ważona: 61,57142857142857

Przypadek 2: Pozostawienie ciszy za sobą

(Miałem zły tydzień, ale to było jakiś czas temu)

[
  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
]

Normalna średnia: 40 Średnia ważona: 42

Przypadek 3: poddanie się

Miałem zły tydzień, to szybko obniża moją średnią.

[
  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
]

Normalna średnia: 40 Średnia ważona: 34

Przypadek 4: Uśrednianie

Okej, więc bawię się tutaj, myślałem, że może to być ta sama wartość dla normalnych i ważonych średnich, ale oczywiście tak nie było.

[
  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
]

Normalna średnia: 31,25 Średnia ważona: 24,0


Problem bonusowy:

Która kombinacja 28 wartości miałaby tę samą średnią normalną i średnią ważoną?


Miłej gry w golfa!

AJFaraday
źródło
1
Możesz także spróbować wygładzenia wykładniczego - new_avg = α*weekly_sum + (1-α)*old_avgdla niektórychα∈(0,1)
Angs
2
0Codziennie robię pompki, więc moja średnia ważona jest taka sama jak moja normalna średnia.
Neil
@Neil nie skorzystałbyś z systemu średniej ważonej;)
AJFaraday
1
uważaj, aby nie przetrenować: p
Brian H.

Odpowiedzi:

3

Łuska , 6 bajtów

AΣΣṫC7

Wypróbuj online!

Wykorzystuje sztuczkę, której Dennis użył, by obezwładnić moją galaretkę. Zamiast powtarzać każdą porcję N razy, pobiera przyrostki z listy porcji, które po spłaszczeniu dadzą ten sam wynik, z wyjątkiem kolejności.

Pan Xcoder
źródło
5

05AB1E , 8 7 bajtów

Zaoszczędzono 1 bajt dzięki Mr. Xcoder

7ô.s˜ÅA

Wypróbuj online!

Wyjaśnienie

7ô         # split list into groups of 7
  .s       # push suffixes
    ˜      # flatten
     ÅA    # arithmetic mean
Emigna
źródło
@ Mr.Xcoder: O tak, wiedziałem, że widziałem wredną funkcję, ale nie mogłem jej znaleźć: P
Emigna
4

Galaretka , 7 bajtów

s7ṫJFÆm

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
Huh, więc x"J$jest równoważne ṫJw tym kontekście. Ciekawy!
Pan Xcoder,
Raczej. Zamiast powtarzać elementy n- tej tablicy n razy, wymaga to wszystkich sufiksów. Po spłaszczeniu generuje te same elementy, ale w innej kolejności.
Dennis
4

R + pryr, 32 28 bajtów

i ten sam średni wynik tydzień w tygodniu doprowadziłby do równości średnich.

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

Wypróbuj online!

Zaoszczędź 4 bajty dzięki produktowi kropkowemu dzięki Giuseppe .

Czysty R użyłby jeszcze dwóch bajtów function

JayCe
źródło
Oczywiście, że tak, to takie oczywiste, teraz myślę o tym.
AJFaraday
1
28 bajtów przy użyciu iloczynu zamiastsum
Giuseppe
Miałem 40 bajtów zfunction(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe
1
@Giuseppe Na szczęście nie pamiętam weighted.mean. Uwielbiam, gdy Routgolfs Python.
JayCe
4

MATL , 10 bajtów

7es4:*s70/

Wypróbuj online!

Od wieków nie opublikowałem odpowiedzi MATL! Pomyślałem, że mogę wziąć udział w LOTM w maju 2018 roku !

Wyjaśnienie:

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
James
źródło
Miałem też K:7Y"*s70/10 bajtów.
Giuseppe
3

Galaretka , 9 bajtów

s7x"J$FÆm

Wypróbuj online!

Jak to działa

s7x "J $ FÆm - Pobiera dane wejściowe z pierwszego argumentu wiersza poleceń i wysyła dane do STDOUT.
s7 - Podziel się na grupy po 7.
   „- Zastosuj wektoryzację (zipwith):
  x J $ - Powtórz elementy każdej listy kilka razy równe indeksowi listy.
      F - Spłaszcz.
       Æm - średnia arytmetyczna.
Pan Xcoder
źródło
2

Haskell , 35 bajtów

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

Premia: jeśli a,b,c,dsą to kwoty tygodniowe, normalna średnia jest taka sama jak średnia ważona iff:

(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

Jednym z rozwiązań jest sytuacja, gdy pierwszy i ostatni tydzień mają takie same kwoty, podobnie drugi i trzeci tydzień mają tę samą sumę, ale istnieje nieskończenie wiele rozwiązań, jeśli twoje bicepsy są w stanie to zrobić. Przykład: [15,10,10,10,10,10,10,5,20,20,20,25,25,20,20,30,20,20,20,20,20,20,10,20,20 , 0,10,10,10]

Wypróbuj online!

Angs
źródło
2

JavaScript (Node.js) , 49 bajtów

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

Wypróbuj online!


Rozwiązanie inne niż ogólne

JavaScript (Node.js) , 39 36 bajtów

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

Wypróbuj online!

DanielIndie
źródło
1
-1 bajt przy pierwszym użyciu a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I. I szybka wskazówka: użyj, <hr>aby utworzyć poziomą linię w przecenie
Herman L
@HermanL Co jest złego w korzystaniu ---(potrzebuje własnego akapitu)?
Neil
2

Stax , 6 bajtów

ñI"%"╟

Uruchom i debuguj na staxlang.xyz!

Rozpakowane (7 bajtów) i objaśnienie:

7/|]$:V
7/         Split into groups of seven.
  |]       Suffixes
    $:V    Flatten and average. Implicit print as fraction.
Khuldraeseth na'Barya
źródło
2

Stax , 10 8 bajtów

äΔ6◙█µøΓ

Uruchom i debuguj

Objaśnienie (rozpakowane):

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
pustkowie
źródło
1
Kolejny za pomocą Stax! Tak! Możesz użyć $do spłaszczenia, jeśli wszystkie elementy są liczbami całkowitymi - sprawdzanie teraz za pomocą OP.
Khuldraeseth na'Barya
2

Węgiel drzewny , 14 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

     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
Neil
źródło
2

K4 / K (oK) , 19 16 14 bajtów

Rozwiązanie:

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

Wypróbuj online!

Przykład:

+/(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

Wyjaśnienie:

Ocena jest przeprowadzana od prawej do lewej. Podzielić 7 1s, 7 2s, 7 3s i 7 4s przez 70 podzielone przez dane wejściowe; następnie podsumuj.

+/(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
streetster
źródło
2

Excel: 33 bajty

(3 bajty zapisane z odpowiedzi @ wernisch poprzez uruchomienie danych w 2 liniach z A1: N1 i A2: N2)

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

Przepraszamy za niedostarczenie tego jako komentarza. Nie mam wystarczającej reputacji, aby to zrobić.

spreadmin8or
źródło
2

Japt , 11 10 bajtów

xÈ/#F*ÒYz7

Spróbuj


Wyjaśnienie

 È             :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
Kudłaty
źródło
1

Trójkątność , 49 bajtów

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

Wypróbuj online!

Wyjaśnienie

)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.
Pan Xcoder
źródło
1

Perl 5 -pa , 28 bajtów

$\+=$_/70*int$i++/7+1for@F}{

Wypróbuj online!

Dane wejściowe są oddzielone spacjami, a nie przecinkami.

Xcali
źródło
Masz do $.dyspozycji jako idealny mnożnik. Nie ma potrzeby$i
Ton Hospel
1

APL + WIN, 13 bajtów

Monity o tablicę jako wektor liczb całkowitych:

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

Wyjaśnienie:

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
Graham
źródło
1

Java 8, 57 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
1

J , 16 bajtów

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

Wyjaśnienie:

              #\           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

Wypróbuj online!

Galen Iwanow
źródło
1

Clojure, 48 46 bajtów

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

Ostatecznie było to krótsze niż połączenie mapcat + subvec.

NikoNyrh
źródło
1

TI-Basic, 25 bajtów

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

Alternatywne rozwiązanie, 39 bajtów

Input L1
For(I,1,70
Ans+L1(I)sum(I>{0,7,21,42
End
Ans/70
Timtech
źródło
1

Rubinowy , 65 bajtów

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

Wypróbuj online!

lfvt
źródło
Rozmiar wejściowy ma być ustalony tutaj na 28 - dzięki czemu można zapisać kilka bajtów, wpisując wartości zamiast korzystać z sizewłaściwości. Wypróbuj online!
Sundar - Przywróć Monikę
1

Excel, 36 33 bajtów

-3 bajty dzięki @tsh.

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

Wprowadź w pierwszym rzędzie ( A1do AB1).

Wernisch
źródło
Może A1:AB1-> 1:1?
tsh
1

Julia 0.6 , 27 bajtów

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

Wypróbuj online!

repeatPołączenie tworzy matrycę kolumny 28 wartości zawiera siedem 1, a następnie siedem 2'S, itp Następnie transpozycji go ', a następnie wykonać mnożenie macierzy z wejściem (mutiplication jest niejawne tutaj). Ponieważ jest to zwielokrotnienie macierzy macierzy 1x28 z macierzą 28x1, otrzymujemy jedną wartość, która jest potrzebną sumą ważoną. Podziel to, 70aby uzyskać średnią ważoną.

sundar - Przywróć Monikę
źródło