Nehmen wir an, dieses Array gibt an, wie viele Liegestütze ich in den letzten 28 Tagen jeden Tag gemacht habe:
[
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
]
Wie Sie sehen, hat es in der letzten Woche einen steilen Aufwärtstrend gegeben, und das ist der Teil dieser Daten, an dem ich am meisten interessiert bin. Je weiter in der Vergangenheit, desto weniger möchte ich, dass diese Daten in meinem Durchschnitt enthalten sind Anzahl der Liegestütze.
Zu diesem Zweck möchte ich einen „Durchschnitt“ ermitteln, bei dem jede Woche mehr wert ist als die vorherige Woche.
Hintergrundinformationen, die nicht Teil dieses Problems sind.
Normaler Durchschnitt:
Die Summe aller Werte / die Anzahl der Werte
Für oben:
1440/28 = 51,42857142857143
Gewichteter Durchschnitt:
Teilen Sie das Array in 4 7er-Gruppen auf und starten Sie ein neues Array.
- Fügen Sie die erste Gruppe zum Array hinzu.
- Fügen Sie die zweite Gruppe zweimal zum Array hinzu.
- Fügen Sie die dritte Gruppe dreimal zum Array hinzu.
- Fügen Sie die vierte Gruppe viermal zum Array hinzu.
Summiere das gesamte neue Array und dividiere durch die Länge des neuen Arrays.
Für oben:
Konvertieren Sie das Array in Folgendes:
[
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
]
Führen Sie dann einen normalen Durchschnitt für dieses Array aus.
4310/70 = 61,57142857142857
Beachten Sie, dass es aufgrund des Aufwärtstrends in der letzten Woche höher als der normale Durchschnittswert ist.
Die Regeln:
- Die Eingabe ist ein flaches Array von 28 nichtnegativen Ganzzahlen.
- Jede Sprache, in der Sie schreiben möchten.
- Geben Sie eine Nummer aus.
- Ich sehe immer gerne TIO- Links.
- Versuchen Sie, das Problem in der kleinsten Anzahl von Bytes zu lösen.
- Das Ergebnis sollte eine auf mindestens 4 Dezimalstellen genaue Dezimalstelle sein (entweder abgeschnitten oder aufgerundet von den Testfallwerten ist in Ordnung) oder ein exakter Bruch.
Testfälle:
Fall 1: Aufwärtstrend
[
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
]
Normaler Durchschnitt: 51.42857142857143 Gewichteter Durchschnitt: 61.57142857142857
Fall 2: Lassen Sie die Ruhe hinter sich
(Ich hatte eine schlechte Woche, aber es ist eine Weile her)
[
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
]
Normaler Durchschnitt: 40 Gewichteter Durchschnitt: 42
Fall 3: Aufgeben
Ich hatte eine schlechte Woche, es zieht meinen Durchschnitt schnell runter.
[
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
]
Normaler Durchschnitt: 40 Gewichteter Durchschnitt: 34
Fall 4: Mittelwertbildung
Okay, ich spiele hier nur herum, ich dachte, es könnte der gleiche Wert für den normalen und den gewichteten Durchschnitt sein, aber das war es natürlich nicht.
[
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
]
Normaler Durchschnitt: 31,25 Gewichteter Durchschnitt: 24,0
Bonusproblem:
Welche Kombination von 28 Werten hätte den gleichen normalen Durchschnitt und den gleichen gewichteten Durchschnitt?
Viel Spaß beim Golfen!
new_avg = α*weekly_sum + (1-α)*old_avg
für einigeα∈(0,1)
0
jeden Tag Liegestütze, daher ist mein gewichteter Durchschnitt der gleiche wie mein normaler Durchschnitt.