Mảng thách thức # 3: Trung bình di chuyển


16

Lưu ý: Đây là số 3 trong một loạt các thử thách . Đối với thử thách trước, bấm vào đây .

Di chuyển trung bình của một danh sách

Trung bình di chuyển của danh sách là một phép tính dẫn đến một danh sách mới, được làm mịn, được tạo bằng cách lấy trung bình các danh sách con chồng chéo nhỏ của bản gốc.

Khi tạo trung bình di chuyển, trước tiên chúng tôi tạo danh sách các danh sách phụ chồng chéo bằng cách sử dụng một 'kích thước cửa sổ' nhất định, dịch chuyển cửa sổ này sang bên phải một lần mỗi lần.

Ví dụ: được đưa ra danh sách [8, 4, 6, 2, 2, 4]và kích thước cửa sổ 3, danh sách phụ sẽ là:

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

Sau đó, chúng tôi tính trung bình trung bình của mỗi danh sách con để thu được kết quả: [6.0, 4.0, 3.3, 2.7](mỗi giá trị được làm tròn đến một vị trí thập phân).


Các thách thức

Nhiệm vụ của bạn là viết chương trình hoặc hàm, đưa ra danh sách L và số nguyên 1 ≤ n ≤ length (L) , tính trung bình di chuyển cho L bằng kích thước cửa sổ n .

Quy tắc:

  • Chương trình của bạn có thể sử dụng phân chia số nguyên hoặc phân chia float. Trong trường hợp phân chia float, không chính xác nhỏ do các giới hạn của kiểu dữ liệu được cho phép, miễn là giá trị này là chính xác.
  • Bạn có thể gửi một chương trình đầy đủ hoặc một chức năng (nhưng không phải là một đoạn).
  • Bạn có thể cho rằng danh sách sẽ chỉ chứa các số nguyên dương .
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng!

Các trường hợp thử nghiệm

Lưu ý rằng, để dễ đọc, tất cả các giá trị được làm tròn đến một chữ số thập phân.

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]

Chúng ta có phải làm tròn các giá trị float hay chúng ta có thể để chúng như vậy không?
caird coinheringaahing

3
@cairdcoinheringaahing Lưu ý rằng, để dễ đọc , tất cả các giá trị được làm tròn đến một chữ số thập phân . Theo tôi, bạn chắc chắn có thể để chúng như cũ (ít nhất đó là những gì tôi hiểu).
Ông Xcoder

@cairdcoinheringaahing Tôi khá tự do với I / O: các giá trị số nguyên hoặc số float đều ổn, bạn có thể làm tròn nếu bạn muốn nhưng không phải và lỗi được phép
FlipTack

Có thể trả lại phân số thay vì số dấu phẩy động không?
JungHwan Min

@JungHwanMin Nếu để chính xác, ngôn ngữ của bạn sẽ lưu trữ các giá trị dưới dạng phân số thay vì nổi, bạn có thể in chúng dưới dạng phân số chính xác ở dạng đơn giản nhất.
FlipTack

Câu trả lời:




7

Haskell , 47 byte

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

Hãy thử trực tuyến!

Đã lưu hai byte nhờ xnor!


1
tail acó thể được trích xuất trong bảo vệ.
xnor

Gah, tôi biết tôi đã bỏ lỡ một cái gì đó như thế. Cảm ơn bạn!
Lynn

7

APL Dyalog, 4 byte

Lưu 1 byte nhờ @Graham

Lưu 2 byte nhờ @ jimmy23013

Tôi đã đề cập đến APL không phải là một ngôn ngữ chơi golf?

⊢+/÷

với nbên phải, hoặc

+/÷⊣

với Lbên phải

Hãy thử trực tuyến!

Làm sao?

÷- chia Lchon

⊢+/- giảm +trên cửa sổ củan


Tại sao không chia L cho n trước khi giảm. Lưu một byte
Graham


Hoặc + /
jimmy23013

@ jimmy23013 cảm ơn rất nhiều! Tôi đã thử cái đó trước đó, nhưng phải gõ sai các đối số vì nó không hoạt động.
Uriel



4

Perl 6 , 33 byte

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

Kiểm tra nó

Mở rộng:

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

Hãy thử trực tuyến!

Chưa được kiểm soát:

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

]+/\%

Hãy thử trực tuyến!

Nhận n làm đối số bên phải và danh sách là bên trái. Tín dụng cho giải pháp của Uriel cho ý tưởng chỉ thực hiện tổng kết trong phần tử.

Giải trình

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

Giải pháp trước đó (7 byte)

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



3

Octave , 33 31 byte

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

Hãy thử trực tuyến!

Giải trình

Convolution ( conv) về cơ bản là một tổng trọng số di chuyển. Nếu các trọng số được chọn là [1/n, ..., 1/n](thu được ~~(1:n)/n), kết quả là một trung bình di động, trong đó chỉ có 'valid'phần được giữ.


2

R , 72 byte

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

Hãy thử trực tuyến!

Tính toán meantất cả các ncửa sổ kích thước ; Khi cửa sổ đi qua rìa của l, kết quả là NAvì vậy chúng tôi lọc chúng ra.

Gói sở thú R +, 13 byte

zoo::rollmean

Các zoogói (cơ sở hạ tầng S3 cho thường xuyên và không thường xuyên Time Series) có rất nhiều chức năng tiện dụng. Bạn có thể thử nó ở đây (R-fiddle) .


2

Japt v2.0a0, 7 byte

ãV ®x÷V

Thử nó


Giải trình

Đầu vào ngầm định của mảng Uvà số nguyên V.

ãV

Nhận phần phụ Uvới chiều dàiV

®

Bản đồ trên các tiểu mục.

÷V

Chia từng phần tử cho V.

x

Tổng tất cả các yếu tố.




1

05AB1E , 5 byte

ŒsùÅA

Giải trình:

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

Hãy thử trực tuyến!





0

Jq 1.5 , 61 byte

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

Mở rộng

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

Hãy thử trực tuyến!


0

JavaScript (ES6), 53 byte

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





0

K (oK) , 13 11 byte

Giải pháp:

{+/+x':y%x}

Hãy thử trực tuyến!

Ví dụ:

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

Giải trình:

oK có tích hợp để tạo cửa sổ trượt, sau đó tổng hợp các mảng kết quả và chia theo kích thước cửa sổ trượt để lấy giá trị trung bình:

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

Có vẻ như bạn không cần mảng lật + và nếu K đi lại như APL, bạn có thể di chuyển x%[commute]sang trái và thả các ô
Uriel

Việc lật là cần thiết để đảm bảo tổng tiền nằm ngang thay vì xuống từng danh sách và khá chắc chắn rằng không có toán tử đi lại, ít nhất là không có gì để đề xuất nó trong hướng dẫn . Chúc mừng dù!
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;}

Giải trình:

Hãy thử nó ở đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.