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!
quelle
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.Antworten:
Schale , 6 Bytes
Probieren Sie es online aus!
Verwendet den Trick, mit dem Dennis meine Jelly-Vorlage übertroffen hat. Anstatt jeden Block N- mal zu wiederholen , werden die Suffixe der Liste der Blöcke abgerufen, die nach dem Reduzieren mit Ausnahme der Reihenfolge das gleiche Ergebnis liefern.
quelle
Python 3 , 38 Bytes
Probieren Sie es online aus!
quelle
05AB1E ,
87 BytesDank Mr. Xcoder 1 Byte gespeichert
Probieren Sie es online aus!
Erläuterung
quelle
Gelee , 7 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
x"J$
ist dasṫJ
in diesem Zusammenhang gleichbedeutend . Interessant!R + Pryr,
3228 Bytesund die gleiche durchschnittliche Punktzahl Woche für Woche würde zu einer Gleichheit der Mittel führen.
Probieren Sie es online aus!
Dank Giuseppe wurden 4 Bytes mithilfe des Punktprodukts gespeichert .
Pure R würde zwei weitere Bytes verwenden
function
quelle
sum
function(s)weighted.mean(s,rep(1:4,e=7))
weighted.mean
.R
Ich liebe es, wenn OutgolfsPython
.MATL , 10 Bytes
Probieren Sie es online aus!
Ich habe seit Ewigkeiten keine MATL-Antwort mehr gepostet! Ich dachte, ich könnte im Rahmen von LOTM Mai 2018 teilnehmen !
Erläuterung:
quelle
K:7Y"*s70/
bei 10 Bytes.Gelee , 9 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
Haskell , 35 Bytes
Bonus: Wenn
a,b,c,d
es sich um die wöchentlichen Beträge handelt, entspricht der normale Durchschnitt dem gewichteten Durchschnitt, wenn:Eine Lösung ist, wenn die erste und die letzte Woche die gleichen Summen haben und die zweite und dritte Woche die gleiche Summe, aber es gibt unendlich viele Lösungen, wenn Ihr Bizeps dazu in der Lage ist. Beispiel: [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]
Probieren Sie es online aus!
quelle
JavaScript (Node.js) , 49 Byte
Probieren Sie es online aus!
Nicht generische Lösung
JavaScript (Node.js) ,
3936 ByteProbieren Sie es online aus!
quelle
a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I
. Und ein kurzer Tipp: Verwenden Sie<hr>
, um eine horizontale Linie in Markdown zu erstellen---
(benötigt einen eigenen Absatz)?Stax , 6 Bytes
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Entpackt (7 Bytes) und Erklärung:
quelle
Stax ,
108 BytesFühren Sie es aus und debuggen Sie es
Erklärung (ausgepackt):
quelle
$
zum Reduzieren verwenden, wenn alle Elemente Ganzzahlen sind. Überprüfen Sie dies jetzt mit OP.Oktave , 33 Bytes
Probieren Sie es online aus!
quelle
Holzkohle , 14 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:
quelle
K4 / K (oK) ,
191614 BytesLösung:
Probieren Sie es online aus!
Beispiel:
Erläuterung:
Die Auswertung erfolgt von rechts nach links. Teilen Sie 7 1s, 7 2s, 7 3s und 7 4s durch 70 geteilt durch die Eingabe; dann fasse zusammen.
quelle
Excel: 33 Bytes
(3 Bytes, die aus der Antwort von @ wernisch gespeichert wurden, indem Daten auf 2 Zeilen von A1: N1 und A2: N2 ausgeführt wurden)
Entschuldigung, dass Sie dies nicht als Kommentar aufgenommen haben. Ich habe nicht genug Ruf dafür.
quelle
Japt ,
1110 BytesVersuch es
Erläuterung
quelle
Dreieckigkeit , 49 Bytes
Probieren Sie es online aus!
Erläuterung
quelle
Perl 5
-pa
, 28 BytesProbieren Sie es online aus!
Die Eingabe ist eher durch Leerzeichen als durch Kommas getrennt.
quelle
$.
als perfekten Multiplikator zur Verfügung. Keine Notwendigkeit für$i
APL + WIN, 13 Bytes
Fordert das Array als Vektor von ganzen Zahlen auf:
Erläuterung:
quelle
Java 8, 57 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
J , 16 Bytes
Erläuterung:
Probieren Sie es online aus!
quelle
Clojure,
4846 BytesDies war kürzer als die Kombination aus Mapcat und Subvec.
quelle
TI-Basic, 25 Bytes
Alternative Lösung, 39 Bytes
quelle
Ruby , 65 Bytes
Probieren Sie es online aus!
quelle
size
Eigenschaft zu verwenden. Probieren Sie es online aus!Excel,
3633 Bytes-3 Bytes dank @tsh.
Eingabe in der ersten Zeile (
A1
bisAB1
).quelle
A1:AB1
->1:1
?Julia 0,6 , 27 Bytes
Probieren Sie es online aus!
Der
repeat
Aufruf bildet eine Spaltenmatrix mit 28 Werten, die sieben'
Einsen , dann sieben Zweien usw. enthält. Wir transponieren sie dann mit und führen dann eine Matrixmultiplikation mit der Eingabe durch (hier ist eine Multiplikation implizit). Da es sich um eine Matrixmultiplikation einer 1x28-Matrix mit einer 28x1-Matrix handelt, erhalten wir einen einzelnen Wert, der die gewichtete Summe ist, die wir benötigen. Teilen Sie das durch70
, um unseren gewichteten Mittelwert zu erhalten.quelle