도전 과제 # 3 : 이동 평균


16

참고 : 이것은 일련의 문제 에서 3 위입니다 . 이전 도전에 대해서는 여기를 클릭하십시오 .

리스트의 이동 평균

목록 의 이동 평균 은 원본의 작은 겹치는 하위 목록을 평균하여 생성 된 새롭고 매끄러운 목록을 생성하는 계산입니다.

이동 평균을 만들 때 먼저 특정 '창 크기'를 사용하여 겹치는 하위 목록 목록을 생성하여 매번이 창을 오른쪽으로 한 번 이동합니다.

예를 들어, 목록 [8, 4, 6, 2, 2, 4]과 창 크기가 주어지면 3하위 목록은 다음 과 같습니다.

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

그런 다음 각 하위 목록 의 평균 평균 을 계산하여 결과를 얻습니다 [6.0, 4.0, 3.3, 2.7](각 값은 소수점 이하 한 자리로 반올림).


도전

당신의 임무는 목록 L 과 정수 1 ≤ n ≤ 길이 (L)가 주어지면 창 크기 n을 사용하여 L에 대한 이동 평균을 계산 하는 프로그램이나 함수를 작성하는 것 입니다.

규칙 :

  • 프로그램은 정수 나누기 또는 부동 나누기를 사용할 수 있습니다 . 부동 소수점 나누기의 경우 값이 정확하지 않으면 데이터 형식의 제한으로 인한 작은 부정확성이 허용됩니다.
  • 전체 프로그램 또는 기능 (스 니펫은 아님)을 제출할 수 있습니다.
  • 목록에 양의 정수만 포함한다고 가정 할 수 있습니다 .
  • 표준 허점은 금지되어 있습니다.
  • 이것은 이므로 가장 짧은 답변 (바이트)이 이깁니다!

테스트 사례

가독성을 쉽게하기 위해 모든 값은 소수점 이하 한 자리로 반올림됩니다.

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]

float 값을 반올림해야합니까, 아니면 그대로 둘 수 있습니까?
caird coinheringaahing

3
@cairdcoinheringaahing 것을 참고 가독성의 편의를 위해 , 모든 값이 소수점 자리로 반올림됩니다 . 내 의견으로는, 당신은 그것들을 그대로 남겨 둘 수 있습니다 (적어도 내가 이해하는 것입니다).
Mr. Xcoder

@cairdcoinheringaahing I / O에 대해 매우 자유 롭습니다. 정수 또는 부동 소수점 값은 괜찮습니다. 원할 경우 반올림 할 수 있으며 부동 소수점 오류가 허용됩니다.
FlipTack

부동 소수점 숫자 대신 분수를 반환해도 괜찮습니까?
JungHwan Min

@JungHwanMin 정확성을 위해 언어가 값을 부동 대신 분수로 저장하는 경우 가장 간단한 형식으로 정확한 분수로 인쇄하는 것이 좋습니다.
FlipTack

답변:



7

Wolfram Language (Mathematica) , 13 바이트

Mathematica에는 모든 것이 내장되어 있습니다

MovingAverage

온라인으로 사용해보십시오!

목록을 가져온 다음 반지름을 가져옵니다.


6
MovingAveragethis_____ ಠ 저는 이것을 믿지 않습니다
Mr. Xcoder

@cairdcoinheringaahing 숫자 값을 취합니다. MovingAverage분수 집합을 반환합니다. 이제 OP가 허용 MovingAverage했으므로 실제로 충분합니다.
Mr. Xcoder


7

Dyalog APL, 4 바이트

@Graham 덕분에 1 바이트 절약

@ jimmy23013 덕분에 2 바이트가 절약되었습니다.

APL이 골프 언어 가 아니라고 언급 했습니까 ?

⊢+/÷

n오른쪽, 또는

+/÷⊣

L오른쪽에.

온라인으로 사용해보십시오!

어떻게?

÷- 분할 Ln

⊢+/- +창문을 줄 입니다n


축소하기 전에 L을 n으로 나눕니다. 바이트 절약
Graham


또는 + / ÷

감사합니다! 나는 그것을 이전에 시도했지만 작동하지 않는 인수를 잘못 입력해야합니다.
Uriel



4

펄 6 , 33 바이트

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

그것을 테스트

넓히는:

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

J, 7 5 바이트

]+/\%

온라인으로 사용해보십시오!

소요 n오른쪽 인자 왼쪽으로 목록으로. 접두사에서 합계 만 수행한다는 아이디어에 대한 Uriel의 솔루션을 인정합니다.

설명

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

이전 솔루션 (7 바이트)

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



3

옥타브 , 33 31 바이트

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

온라인으로 사용해보십시오!

설명

컨벌루션 ( conv)은 기본적으로 움직이는 가중치 합계입니다. 가중치가 [1/n, ..., 1/n](으로 획득)로 선택된 경우 ~~(1:n)/n결과는 이동 평균이며 그 중 'valid'파트 만 유지됩니다.


2

R , 72 바이트

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

온라인으로 사용해보십시오!

mean모든 크기 n창을 계산합니다 . 창이 가장자리를 지나갈 때 l결과는 NA필터링되어 필터링됩니다.

R + 동물원 패키지, 13 바이트

zoo::rollmean

zoo패키지 (정기 및 부정기 시간 시리즈 S3 인프라는) 편리한 기능을 많이 가지고 있습니다. 당신은 할 수 있습니다 여기에 그것을 시도 (R-바이올린) .


2

Japt v2.0a0, 7 바이트

ãV ®x÷V

시도 해봐


설명

어레이의 묵시적 입력 U정수 V.

ãV

U길이 가있는 하위 섹션 가져 오기V

®

하위 섹션을 매핑하십시오.

÷V

각 요소를로 나눕니다 V.

x

모든 요소를 ​​합산하십시오.









0

자바 스크립트 (ES6), 53 바이트

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





0

K (oK) , 13 11 바이트

해결책:

{+/+x':y%x}

온라인으로 사용해보십시오!

예 :

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

설명:

oK 슬라이딩 윈도우를 만드는 내장 기능이 있으며 결과 배열을 요약하고 슬라이딩 윈도우 크기로 나눠 평균을 얻습니다.

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

플립 배열이 필요하지 않은 것 같습니다. + K가 APL처럼 출퇴근하는 경우 x%[commute]왼쪽으로 이동 하여 파 렌스를 떨어 뜨릴 수 있습니다
Uriel

플립은 합계가 확인하기 위해 필요 에 걸쳐 보다는 각 목록 아래로, 공정하게 확인 적어도 아무것도에 제안 없음에, 더 출퇴근 운영자가 없습니다 매뉴얼 . 건배!
streetster

0

DataWeave , 50 바이트

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

자바 8, 111 바이트

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

설명:

여기에서 시도하십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.