Array Tantangan # 3: Rata-Rata Bergerak


16

Catatan: Ini adalah # 3 dalam serangkaian tantangan . Untuk tantangan sebelumnya, klik di sini .

Rata-Rata Bergerak dari Daftar

The rata-rata bergerak dari daftar adalah perhitungan menghasilkan baru, merapikan daftar, yang diciptakan oleh rata-rata sublists tumpang tindih kecil yang asli.

Saat membuat rata-rata bergerak, pertama-tama kami membuat daftar sublabel yang tumpang tindih menggunakan 'ukuran jendela' tertentu, menggeser jendela ini ke kanan satu kali setiap kali.

Misalnya, mengingat daftar [8, 4, 6, 2, 2, 4]dan ukuran jendela 3, sublists akan menjadi:

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

Kami kemudian menghitung rata - rata rata - rata setiap sublist untuk mendapatkan hasil: [6.0, 4.0, 3.3, 2.7](setiap nilai dibulatkan ke satu tempat desimal).


Tantangan

Tugas Anda adalah menulis program atau fungsi yang, diberi daftar L , dan bilangan bulat 1 ≤ n ≤ panjang (L) , menghitung rata-rata bergerak untuk L menggunakan ukuran jendela n .

Aturan:

  • Program Anda dapat menggunakan divisi integer atau divisi float. Dalam kasus divisi float, ketidakakuratan kecil karena keterbatasan tipe data diizinkan, asalkan nilainya benar.
  • Anda dapat mengirimkan program lengkap, atau suatu fungsi (tetapi bukan cuplikan).
  • Anda dapat mengasumsikan bahwa daftar hanya akan berisi bilangan bulat positif .
  • Celah standar dilarang.
  • Ini , jadi jawaban tersingkat (dalam byte) menang!

Uji Kasus

Perhatikan bahwa, untuk kemudahan keterbacaan, semua nilai dibulatkan ke satu tempat desimal.

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]

Apakah kita harus membulatkan nilai float, atau bisakah kita membiarkannya seperti apa adanya?
caird coinheringaahing

3
@cairdcoinheringaahing Perhatikan bahwa, untuk kemudahan keterbacaan , semua nilai dibulatkan ke satu tempat desimal . Menurut pendapat saya, Anda pasti dapat meninggalkan mereka apa adanya (setidaknya itulah yang saya mengerti).
Tn. Xcoder

@cairdcoinheringaahing Saya sudah cukup liberal dengan nilai I / O: integer atau float baik-baik saja, Anda bisa membulatkannya jika Anda mau tetapi tidak harus, dan kesalahan floating point diperbolehkan
FlipTack

Apakah saya tetap bisa mengembalikan pecahan alih-alih angka floating point?
JungHwan Min

@JungHwanMin Jika untuk keakuratan, bahasa Anda akan menyimpan nilai sebagai pecahan daripada float, tidak masalah untuk mencetaknya sebagai pecahan yang akurat dalam bentuk paling sederhana.
FlipTack

Jawaban:




7

Haskell , 47 byte

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

Cobalah online!

Disimpan dua byte berkat xnor!


1
tail adapat diekstraksi di penjaga.
xnor

Gah, aku tahu aku melewatkan sesuatu seperti itu. Terima kasih!
Lynn

7

Dyalog APL, 4 byte

1 byte disimpan berkat @Graham

2 byte disimpan berkat @ jimmy23013

Apakah saya menyebutkan APL bukan bahasa golf?

⊢+/÷

dengan ndi sebelah kanan, atau

+/÷⊣

dengan Ldi sebelah kanan.

Cobalah online!

Bagaimana?

÷- dibagi Ldengann

⊢+/- Mengurangi +pada windowsn


Mengapa tidak membagi L dengan n sebelum reduksi. Menghemat satu byte
Graham



@ jimmy23013 terima kasih banyak! Saya sudah mencoba yang sebelumnya, tapi pasti salah mengetik argumen karena itu tidak berhasil.
Uriel

6

Python , 48 byte

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

Cobalah online!

Fungsi rekursif. Lebih pendek dari program (50 byte)

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

Cobalah online!

Ini menghemat 2 byte dengan mengakhiri dengan kesalahan pada whilekondisi.



4

Perl 6 , 33 byte

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

Menguji

Diperluas:

{  # 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 byte

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];}

Cobalah online!

Belum dibuka:

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 byte

]+/\%

Cobalah online!

Dibawa nsebagai argumen kanan dan daftar sebagai kiri. Penghargaan untuk solusi Uriel untuk ide melakukan penjumlahan di infiks.

Penjelasan

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

Solusi sebelumnya (7 byte)

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

4

Ohm v2 , 3 byte

ÇÆm

Cobalah online!

Penjelasan:

ÇÆm  Main wire, arguments l (list) and n (integer)

Ç    All consecutive sublists of l with length n
 Æm  Arithmetic mean of each sublist

3

Pyth , 5 byte

.O.:F

Coba di sini!

Bagaimana ini bekerja?

.O.: F - Program lengkap.

    F - Mengurangi input (daftar bersarang) dengan ...
  .: - ... Sublists.
.O - Rata-rata dari masing-masing.

3

Oktaf , 33 31 byte

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

Cobalah online!

Penjelasan

Konvolusi ( conv) pada dasarnya adalah jumlah tertimbang yang bergerak. Jika bobot dipilih sebagai [1/n, ..., 1/n](diperoleh sebagai ~~(1:n)/n) hasilnya adalah rata-rata bergerak, yang hanya 'valid'bagian yang disimpan.


2

R , 72 byte

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

Cobalah online!

Menghitung meansemua ukuran njendela; ketika jendela melewati tepi l, hasilnya NAjadi kami menyaringnya.

Paket R + kebun binatang, 13 byte

zoo::rollmean

The zoopaket (infrastruktur S3 untuk Regular dan Irregular Time Series) memiliki banyak fungsi berguna. Anda dapat mencobanya di sini (R-biola) .


2

Japt v2.0a0, 7 byte

ãV ®x÷V

Cobalah


Penjelasan

Input implisit dari array Udan integer V.

ãV

Dapatkan subbagian Udengan panjangV

®

Peta di atas subbagian.

÷V

Bagilah setiap elemen dengan V.

x

Jumlahkan semua elemen.




1

05AB1E , 5 byte

ŒsùÅA

Penjelasan:

Π    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.

Cobalah online!



1

Proton , 46 byte

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

Cobalah online!

Perhatikan bahwa ini mengambil input melalui sintaks fungsi currying, dan mengembalikan daftar fraksi.



0

Jq 1,5 , 61 byte

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

Diperluas

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

Cobalah online!


0

JavaScript (ES6), 53 byte

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

0

PHP, 94 byte

function f($l,$n){while($i<=count($l)-$n)$r[]=array_sum(array_slice($l,$i++,$n))/$n;return$r;}

Cobalah online!



0

Ditumpuk , 22 byte

[infixes[:sum\#'/]map]

Cobalah online!

Penjelasan

infixesmenghasilkan semua jendela dengan panjang yang diberikan. Kemudian, kami memetakan fungsi rata-rata kami sendiri untuk setiap infiks.



0

K (oK) , 13 11 byte

Larutan:

{+/+x':y%x}

Cobalah online!

Contoh:

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

Penjelasan:

oK memiliki built-in untuk membuat jendela geser, lalu jumlah array yang dihasilkan dan bagi dengan ukuran jendela geser untuk mendapatkan rata-rata:

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

Sepertinya Anda tidak memerlukan flip array +, dan jika K telah bolak-balik seperti APL, Anda dapat pindah x%[commute]ke kiri dan melepas parens
Uriel

Flip diperlukan untuk memastikan jumlahnya adalah di bukan ke bawah setiap daftar, dan cukup yakin tidak ada operator yang bolak-balik, setidaknya ada indikasi dalam panduan . Ceria meskipun!
streetster

0

DataWeave , 50 byte

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 byte

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;}

Penjelasan:

Coba di sini.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.