Un tableau de défis # 3: Moyennes mobiles


16

Remarque: Il s'agit du n ° 3 d'une série de défis de de . Pour le défi précédent, cliquez ici .

Moyenne mobile d'une liste

La moyenne mobile d'une liste est un calcul résultant en une nouvelle liste lissée, créée en faisant la moyenne de petites sous-listes superposées de l'original.

Lors de la création d'une moyenne mobile, nous générons d'abord la liste des sous-listes qui se chevauchent en utilisant une certaine «taille de fenêtre», en déplaçant cette fenêtre vers la droite une fois à chaque fois.

Par exemple, étant donné la liste [8, 4, 6, 2, 2, 4]et la taille de la fenêtre 3, les sous-listes seraient:

[8,  4,  6,  2,  2,  4]          Sublists:
(         )                  <-  [8, 4, 6]
    (         )              <-  [4, 6, 2]
        (         )          <-  [6, 2, 2]
            (         )      <-  [2, 2, 4]

Nous calculons ensuite la moyenne moyenne de chaque sous-liste pour obtenir le résultat: [6.0, 4.0, 3.3, 2.7](chaque valeur arrondie à une décimale).


Le défi

Votre tâche consiste à écrire un programme ou une fonction qui, étant donné une liste L et un entier 1 ≤ n ≤ longueur (L) , calcule la moyenne mobile de L en utilisant la taille de fenêtre n .

Règles:

  • Votre programme peut utiliser une division entière ou une division flottante. Dans le cas de la division flottante, de petites inexactitudes dues aux limitations du type de données sont autorisées, tant que la valeur est par ailleurs correcte.
  • Vous pouvez soumettre un programme complet ou une fonction (mais pas un extrait).
  • Vous pouvez supposer que la liste ne contiendra que des entiers positifs .
  • Les failles standard sont interdites.
  • Il s'agit de , donc la réponse la plus courte (en octets) l'emporte!

Cas de test

Notez que, pour plus de lisibilité, toutes les valeurs sont arrondies à une décimale.

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]

Devons-nous arrondir les valeurs flottantes ou pouvons-nous les laisser telles quelles?
caird coinheringaahing

3
@cairdcoinheringaahing Notez que, pour plus de lisibilité , toutes les valeurs sont arrondies à une décimale . À mon avis, vous pouvez certainement les laisser tels quels (du moins c'est ce que je comprends).
M. Xcoder

@cairdcoinheringaahing J'ai été assez libéral avec les E / S: les valeurs entières ou flottantes sont correctes, vous pouvez arrondir si vous le souhaitez mais n'y êtes pas obligé, et les erreurs en virgule flottante sont autorisées
FlipTack

Est-il correct de renvoyer des fractions au lieu de nombres à virgule flottante?
JungHwan Min

@JungHwanMin Si pour plus de précision, votre langue stockera les valeurs sous forme de fractions plutôt que de flottants, il est bon de les imprimer sous forme de fractions précises dans leurs formes les plus simples.
FlipTack

Réponses:




7

Haskell , 47 octets

n!a|length a<n=[]|_:t<-a=div(sum$take n a)n:n!t

Essayez-le en ligne!

Sauvegardé deux octets grâce à xnor!


1
tail apeut être extrait dans la garde.
2017

Gah, je savais que je manquais quelque chose comme ça. Je vous remercie!
Lynn

7

Dyalog APL, 4 octets

1 octet enregistré grâce à @Graham

2 octets enregistrés grâce à @ jimmy23013

Ai-je mentionné que l'APL n'est pas une langue de golf?

⊢+/÷

avec nà droite, ou

+/÷⊣

avec Là droite.

Essayez-le en ligne!

Comment?

÷- diviser Lparn

⊢+/- réduire +sur les fenêtres den


Pourquoi ne pas diviser L par n avant la réduction. Enregistre un octet
Graham



@ jimmy23013 merci beaucoup! J'ai essayé celui-là plus tôt, mais j'ai dû mal taper les arguments parce que cela ne fonctionnait pas.
Uriel

6

Python , 48 octets

f=lambda n,l:l[n-1:]and[sum(l[:n])/n]+f(n,l[1:])

Essayez-le en ligne!

Une fonction récursive. Plus court que le programme (50 octets)

n,l=input()
while l[-n]:print sum(l[:n])/n;l=l[1:]

Essayez-le en ligne!

Cela économise 2 octets en se terminant avec une erreur sur la whilecondition.



4

Perl 6 , 33 octets

{@^a.rotor($^b=>1-$b)».sum X/$b}

Essaye-le

Étendu:

{  # bare block with placeholder parameters 「@a」, 「$b」

  @^a                # declare and use first param

  .rotor(            # split it into chunks
    $^b              # declare and use second param
    =>               # pair it with
    1 - $b           # one less than that, negated

  )».sum             # sum each of the sub lists

  X/                 # cross that using &infix:«/»

  $b                 # with the second param
}

4

C,  86   84  83 octets

i,j,s;f(a,l,n)int*a;{for(i=-1;i+++n<l;s=!printf("%d ",s/n))for(j=n;j--;)s+=a[i+j];}

Essayez-le en ligne!

Déroulé:

i, j, s;
f(a, l, n)int*a;
{
    for(i=-1; i+++n<l; s=!printf("%d ", s/n))
        for(j=n; j--;)
            s += a[i+j];
}

4

J, 7 5 octets

]+/\%

Essayez-le en ligne!

Prend ncomme argument de droite et la liste comme gauche. Nous remercions la solution d'Uriel pour l'idée de ne faire que la sommation dans l'infixe.

Explication

]+/\%
    %  Divide list by n
]+/\   Sum on overlapping intervals of size n

Solution précédente (7 octets)

(+/%#)\
      \  Apply to overlapping intervals of size n
(+/%#)   Mean
 +/        Sum
   %       Divided by
    #      Length


3

Pyth , 5 octets

.O.:F

Essayez-le ici!

Comment ça marche

.O.: F - Programme complet.

    F - Réduisez l'entrée (liste imbriquée) avec ...
  .: - ... Sous-listes.
.O - Moyenne de chacun.

3

Octave , 33 31 octets

@(x,n)conv(x,~~(1:n)/n,'valid')

Essayez-le en ligne!

Explication

La convolution ( conv) est essentiellement une somme pondérée mobile. Si les poids sont choisis comme [1/n, ..., 1/n](obtenus comme ~~(1:n)/n) le résultat est une moyenne mobile, dont seule la 'valid'partie est conservée.


2

R , 72 octets

function(l,n)(k=sapply(0:sum(l|1),function(x)mean(l[x+1:n])))[!is.na(k)]

Essayez-le en ligne!

Calcule la meande toutes les nfenêtres de taille ; lorsque la fenêtre dépasse le bord de l, les résultats sont NAdonc nous les filtrons.

Forfait R + zoo, 13 octets

zoo::rollmean

Le zoopackage (infrastructure S3 pour les séries chronologiques régulières et irrégulières) possède de nombreuses fonctions pratiques. Vous pouvez l' essayer ici (R-violon) .


2

Japt v2.0a0, 7 octets

ãV ®x÷V

Essayez-le


Explication

Entrée implicite de tableau Uet d'entier V.

ãV

Obtenez des sous-sections de UlongueurV

®

Carte sur les sous-sections.

÷V

Divisez chaque élément par V.

x

Additionnez tous les éléments.




1

05AB1E , 5 octets

ŒsùÅA

Explication:

Π    All substrings
 sù   Keep those only where the length is equal to <the second input>
   ÅA Arithmetic mean of each element in the resulting array.

Essayez-le en ligne!



1

Proton , 46 octets

n=>l=>[sum(l[h to h+n])/n for h:0..len(l)-n+1]

Essayez-le en ligne!

Notez que cela prend une entrée via la syntaxe des fonctions de curry et retourne une liste de fractions.



0

Jq 1,5 , 61 octets

def f(N;L):[L|range(0;1+length-N)as$i|.[$i:$i+N]|add/length];

Étendu

def f(N;L):
  [   L
    | range(0;1+length-N) as $i        # generate
    | .[$i:$i+N]                       # sublists
    | add/length                       # compute mean
  ];

Essayez-le en ligne!


0

JavaScript (ES6), 53 octets

(l,n)=>l.map(e=>(s+=e-=a[i-n]||0)/n,s=i=0).slice(n-1)





0

K (oK) , 13 11 octets

Solution:

{+/+x':y%x}

Essayez-le en ligne!

Exemples:

{+/+x':y%x}[3;8 4 6 2 2 4]
6 4 3.3333 2.6667
{+/+x':y%x}[5;1 2 3 4 5 6 7 8]
3 4 5 6

Explication:

oK a une fonction intégrée pour créer une fenêtre coulissante, puis résumez les tableaux résultants et divisez par taille de fenêtre coulissante pour obtenir la moyenne:

{+/+x':y%x} / the solution
{         } / lambda function taking x and y as implicit parameters
       y%x  / y (list) by x (sliding array size)
    x':     / sliding window of size x over list y
   +        / flip array (rotate by 90 degrees)
 +/         / sum up array

Il semble que vous n'ayez pas besoin du tableau inversé +, et si K a fait la navette comme APL, vous pouvez vous déplacer x%[commute]vers la gauche et supprimer les parens
Uriel

Le retournement est nécessaire pour s'assurer que la somme est à travers plutôt que vers le bas de chaque liste, et assez sûr qu'il n'y a pas d'opérateur de navette, du moins rien à suggérer dans le manuel . Bravo cependant!
streetster

0

DataWeave , 50 octets

fun s(l,w)=0 to(sizeOf(l)-w)map avg(l[$ to $+w-1])
%dw 2.0
output application/json

fun sma(list: Array<Number>, window: Number) =
  0 to (sizeOf(list) - window)  // generate starting indices of sublists
  map list[$ to $ + window - 1] // generate sublists
  map avg($)                    // calculate averages

---
sma([90, 40, 45, 100, 101], 2)


0

Java 8, 111 octets

a->n->{int l=a.length-n+1,i=0,j;float[]r=new float[l];for(;i<l;r[i++]/=n)for(j=i;j<i+n;r[i]+=a[j++]);return r;}

Explication:

Essayez-le ici.

a->n->{                 // Method with array and int parameters and float-array return-type
  int l=a.length-n+1,   //  New length of the return-array
      i=0,j;            //  Index-integers
  float[]r=new float[l];//  Return-array
  for(;i<l;             //  Loop (1) from 0 to `l` (exclusive)
      r[i++]/=n)        //    After every iteration, divide the current item by input `n`
    for(j=i;j<i+n;      //   Inner loop (2) from `i` to `i+n` (exclusive)
      r[i]+=a[j++]      //    Sum the result at index `i` with the items of the input-array
    );                  //   End of inner loop (2)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the resulting float-array
}                       // End of method
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.