Hinweis: Dies ist die Nummer 3 in einer Reihe von Array-Manipulationsherausforderungen . Für die vorherige Herausforderung klicken Sie hier .
Gleitender Durchschnitt einer Liste
Der gleitende Durchschnitt einer Liste ist eine Berechnung, die zu einer neuen, geglätteten Liste führt, die durch Mitteln kleiner überlappender Unterlisten des Originals erstellt wird.
Bei der Erstellung eines gleitenden Durchschnitts wird zunächst die Liste der überlappenden Unterlisten mit einer bestimmten Fenstergröße erstellt, wobei dieses Fenster jedes Mal nach rechts verschoben wird.
Bei gegebener Liste [8, 4, 6, 2, 2, 4]
und Fenstergröße 3
wären die Unterlisten beispielsweise:
[8, 4, 6, 2, 2, 4] Sublists:
( ) <- [8, 4, 6]
( ) <- [4, 6, 2]
( ) <- [6, 2, 2]
( ) <- [2, 2, 4]
Wir berechnen dann den Mittelwert jeder Unterliste, um das Ergebnis zu erhalten: [6.0, 4.0, 3.3, 2.7]
(jeder Wert wird auf eine Dezimalstelle gerundet).
Die Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei gegebener Liste L und einer ganzen Zahl von 1 ≤ n ≤ Länge (L) den gleitenden Durchschnitt für L unter Verwendung der Fenstergröße n berechnet .
Regeln:
- Ihr Programm kann eine Ganzzahl- oder eine Gleitkommadivision verwenden. Bei der Float-Division sind kleine Ungenauigkeiten aufgrund der Einschränkungen des Datentyps zulässig, sofern der Wert ansonsten korrekt ist.
- Sie können ein vollständiges Programm oder eine Funktion (aber kein Ausschnitt) einreichen.
- Sie können davon ausgehen, dass die Liste nur positive ganze Zahlen enthält .
- Standardlücken sind verboten.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort (in Bytes)!
Testfälle
Beachten Sie, dass zur besseren Lesbarkeit alle Werte auf eine Dezimalstelle gerundet werden.
n=5, [1, 2, 3, 4, 5, 6, 7, 8] -> [3, 4, 5, 6]
n=3, [100, 502, 350, 223, 195] -> [317.3, 358.3, 256]
n=1, [10, 10, 10] -> [10, 10, 10]
n=3, [10, 20, 30] -> [20]
n=2, [90, 40, 45, 100, 101] -> [65, 42.5, 72.5, 100.5]
Antworten:
Gelee , 3 Bytes
Probieren Sie es online!
Ganz einfach dank
ṡ
Wie es funktioniert
quelle
Wolfram Language (Mathematica) , 13 Byte
In Mathematica ist für alles etwas eingebaut
Probieren Sie es online!
Nimmt eine Liste und dann einen Radius ...
quelle
MovingAverage
ಠ _____ ಠ Ich weigere mich, das zu glaubenMovingAverage
Gibt eine Menge von Brüchen zurück. Nun, da es vom OP erlaubt wurde,MovingAverage
sollte es in der Tat ausreichen.Haskell , 47 Bytes
Probieren Sie es online!
Zwei Bytes dank xnor gespart!
quelle
tail a
kann in der Wache extrahiert werden.Dyalog APL, 4 Bytes
1 Byte gespeichert dank @Graham
2 Bytes gespart dank @ jimmy23013
Habe ich schon erwähnt, dass APL keine Golfsprache ist?
mit
n
rechts, odermit
L
auf der rechten Seite.Probieren Sie es online!
Wie?
÷
- TeilenL
durchn
⊢+/
- Reduzieren Sie+
auf Fenster vonn
quelle
Python , 48 Bytes
Probieren Sie es online!
Eine rekursive Funktion. Kürzer als das Programm (50 Bytes)
Probieren Sie es online!
Das spart 2 Bytes, indem es unter der
while
Bedingung mit Fehler beendet wird.quelle
Tragen Sie 3 Bytes ein
Probieren Sie es online!
quelle
Perl 6 , 33 Bytes
Probier es aus
Erweitert:
quelle
C
868483 BytesProbieren Sie es online!
Abgerollt:
quelle
J,
7,5BytesProbieren Sie es online!
Nimmt
n
als rechtes Argument und die Liste als linkes. Dank an Uriels Lösung für die Idee, nur die Summierung im Infix durchzuführen.Erläuterung
Vorherige Lösung (7 Bytes)
quelle
Ohm v2 , 3 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Pyth , 5 Bytes
Probieren Sie es hier aus!
Wie das geht
quelle
Oktave ,
3331 BytesProbieren Sie es online!
Erläuterung
Convolution (
conv
) ist im Wesentlichen eine bewegte gewichtete Summe. Wenn die Gewichte als[1/n, ..., 1/n]
(erhalten als~~(1:n)/n
) gewählt werden, ist das Ergebnis ein gleitender Durchschnitt, von dem nur der'valid'
Teil beibehalten wird.quelle
R , 72 Bytes
Probieren Sie es online!
Berechnet
mean
die Größe allern
Fenster. Wenn das Fenster den Rand von überschreitetl
, werden die ErgebnisseNA
so herausgefiltert, dass wir sie herausfiltern.R + Zoo-Paket, 13 Bytes
Das
zoo
Paket (S3-Infrastruktur für reguläre und unregelmäßige Zeitreihen) verfügt über viele praktische Funktionen. Sie können es hier versuchen (R-Geige) .quelle
Japt v2.0a0, 7 Bytes
Versuch es
Erläuterung
Implizite Eingabe von Array
U
und GanzzahlV
.Holen Sie sich Unterabschnitte
U
mit LängeV
Karte über die Unterabschnitte.
Teilen Sie jedes Element durch
V
.Summiere alle Elemente.
quelle
Python 3 , 61 Bytes
Probieren Sie es online!
quelle
Python 3 , 55 Bytes
Probieren Sie es online!
quelle
05AB1E , 5 Bytes
Erläuterung:
Probieren Sie es online!
quelle
Mathematica, 21 Bytes
Probieren Sie es online!
-3 Bytes JungHwan min
quelle
N[Mean/@##~Partition~1]&
Proton , 46 Bytes
Probieren Sie es online!
Beachten Sie, dass dies über die Currying-Funktionssyntax eingegeben wird und eine Liste von Brüchen zurückgibt.
quelle
CJam,
1412 Bytes-2 Bytes dank @aditsu
quelle
Jq 1,5 , 61 Bytes
Erweitert
Probieren Sie es online!
quelle
JavaScript (ES6), 53 Byte
quelle
PHP, 94 Bytes
Probieren Sie es online!
quelle
Clojure , 48 Bytes
Probieren Sie es online!
quelle
Gestapelt , 22 Bytes
Probieren Sie es online!
Erläuterung
infixes
generiert alle Fenster der angegebenen Länge. Dann bilden wir über jedes Infix unsere eigene Durchschnittsfunktion ab.quelle
Common Lisp , 77 Bytes
Probieren Sie es online!
quelle
K (oK) ,
1311 BytesLösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
oK
verfügt über eine integrierte Funktion zum Erstellen eines Schiebefensters. Fassen Sie die resultierenden Arrays zusammen und dividieren Sie sie durch die Größe des Schiebefensters, um den Mittelwert zu erhalten:quelle
x%[commute]
nach links gehen und die Parens ablegenDataWeave , 50 Bytes
quelle
Funky ,
6766 BytesEin Byte mit Curry-Syntax gespeichert.
Probieren Sie es online!
quelle
Java 8, 111 Bytes
Erläuterung:
Probieren Sie es hier aus.
quelle