가중 평균-프레스 업 경향 문제


10

이 배열은 지난 28 일 동안 매일 달성 한 프레스 업 수입니다.

[
  20,20,20,30,30,30,30,
  35,35,40,40,40,45,45,
  50,50,50,50,50,50,50,
  60,70,80,90,100,110,120
]

보시다시피, 지난 주에 가파른 상승세를 보였으며 이것이 가장 관심이있는 데이터의 일부입니다. 과거에 더 많이 볼수록 해당 데이터가 '평균'에 더 적게 표시되기를 바랍니다. '프레스 업 수.

이를 위해 매주 전주보다 가치가 높은 '평균'을 만들고 싶습니다.


이 문제의 일부가 아닌 배경 정보.

보통 평균 :

모든 값의 합 / 값 수

위의 경우 :

1440/28 = 51.42857142857143


가중 평균:

어레이를 7 개의 4 개 그룹으로 나누고 새 어레이를 시작하십시오.

  • 첫 번째 그룹을 배열에 추가하십시오.
  • 두 번째 그룹을 배열에 두 번 추가하십시오.
  • 배열 세 번째에 세 번째 그룹을 추가하십시오.
  • 네 번째 그룹을 배열에 네 번 추가하십시오.

의 길이만큼 새로운 배열 모두 나눈 합계 새로운 배열.

위의 경우 :

배열을 다음과 같이 변환하십시오.

[
  20,20,20,30,30,30,30, # first week once
  35,35,40,40,40,45,45, 
  35,35,40,40,40,45,45, # second week twice
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50, # third week thrice
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120,
  60,70,80,90,100,110,120 # Fourth week four times
]

그런 다음 해당 배열에서 정상 평균을 실행하십시오.

4310/70 = 61.57142857142857

지난 주 상승 추세로 인해 평균 평균값보다 높습니다.


규칙:

  • 입력은 28 개의 음이 아닌 정수로 구성된 평면 배열입니다.
  • 쓰고 싶은 모든 언어.
  • 숫자를 출력합니다.
  • 저는 항상 TIO 링크 를보고 싶습니다 .
  • 가장 적은 바이트 수로 문제를 해결하십시오.
  • 결과는 소수점 이하 4 자리 (테스트 케이스 값에서 잘 리거나 반올림 됨)까지 정확한 소수이거나 정확한 분수 여야합니다.

테스트 사례 :

사례 1 : 상승 추세

[
  20,20,20,30,30,30,30,
  35,35,40,40,40,45,45,
  50,50,50,50,50,50,50,
  60,70,80,90,100,110,120
]

정상 평균 : 51.42857142857143 가중 평균 : 61.57142857142857

사례 2 : 미루어두기

(나쁜 주가 있었지만 얼마 전이었다)

[
  50,50,50,50,50,50,50,
  10,10,10,10,10,10,10,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50
]

보통 평균 : 40 가중 평균 : 42

사례 3 : 포기

나는 나쁜 주를 보냈습니다, 그것은 내 평균을 빨리 내리고 있습니다.

[
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  50,50,50,50,50,50,50,
  10,10,10,10,10,10,10
]

보통 평균 : 40 가중 평균 : 34

사례 4 : 평균화

좋아, 그래서 나는 단지 여기에서 놀고 있는데, 그것이 정상 및 가중 평균에 대해 동일한 값 일 것이라고 생각했지만 물론 그렇지 않았습니다.

[
  60,60,60,60,60,60,60,
  30,30,30,30,30,30,30,
  20,20,20,20,20,20,20,
  15,15,15,15,15,15,15
]

정상 평균 : 31.25 가중 평균 : 24.0


보너스 문제 :

동일한 평균과 가중 평균을 갖는 28 개의 값 조합은 무엇입니까?


행복한 골프!



1
지수 new_avg = α*weekly_sum + (1-α)*old_avgα∈(0,1)
평활도

2
나는 어떻게 0나의 가중 평균 내 정상 평균과 동일하므로, 매일 프레스 업.
Neil

@ 닐 당신은 가중 평균 시스템으로부터 혜택을받지 못할 것입니다;)
AJFaraday 20

1
과도하게 훈련하지 않도록주의하십시오 : p
Brian H.

답변:





4

젤리 , 7 바이트

s7ṫJFÆm

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

작동 원리

s7ṫJFÆm  Main link. Argument: A (array of length 28)

s7       Split the array into chunks of length 7.
   J     Indices; yield [1, ..., 28].
  ṫ      Tail; yield the 1st, ..., 28th suffix of the result to the left.
         Starting with the 5th, the suffixes are empty arrays.
    F    Flatten the resulting 2D array.
     Æm  Take the arithmetic mean.

허, 이 맥락에서 x"J$와 같습니다 ṫJ. 흥미 롭습니다!
Mr. Xcoder

일종의. n 번째 배열 의 요소를 n 번 반복하는 대신 모든 접미사를 사용합니다. 전개 후에는 동일한 요소를 생성하지만 다른 순서로 생성합니다.
Dennis

4

R + pryr, 32 28 바이트

주당 동일한 평균 점수는 평균의 평등을 초래할 것입니다.

pryr::f(s%*%rep(1:4,e=7)/70)

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

Giuseppe 덕분에 내적을 사용하여 4 바이트를 절약했습니다 .

순수한 R은 function


물론, 그것은 분명합니다. 이제 저는 그것에 대해 생각합니다.
AJFaraday

1
대신 도트 제품을 사용하는 28 바이트sum
Giuseppe

나는 40 바이트를 가지고 있었다function(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe

1
@Giuseppe 운 좋게 나는 기억하지 않았다 weighted.mean. Routgolfs 때 그것을 사랑하십시오 Python.
JayCe

4

MATL , 10 바이트

7es4:*s70/

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

나는 연령대에 MATL 답변을 게시하지 않았습니다! LOTM 2018 년 5 월의 일부로 참여할 수 있다고 생각했습니다 !

설명:

7e          % Reshape the array into 7 rows (each week is one column)
  s         % Sum each column
   4:       % Push [1 2 3 4]
     *      % Multiply each columnar sum by the corresponding element in [1 2 3 4]
      s     % Sum this array
       70/  % Divide by 70

나는 K:7Y"*s70/10 바이트도 가지고 있었다 .
주세페

3

젤리 , 9 바이트

s7x"J$FÆm

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

작동 원리

s7x "J $ FÆm – 첫 번째 명령 줄 인수에서 입력을 가져와 STDOUT으로 출력합니다.
s7 – 7 개 그룹으로 나눕니다.
   "– 벡터화 적용 (zipwith) :
  x J $ – 목록의 색인과 같은 횟수만큼 각 목록의 요소를 반복합니다.
      F – 평평하게합니다.
       Æm – 산술 평균.

2

하스켈 , 35 바이트

(/70).sum.zipWith(*)([1..]<*[1..7])

보너스 : if a,b,c,d 주간 합계 인 경우 정상 평균은 가중 평균 iff와 동일합니다.

(a + b + c + d)/4 = (a + 2b + 3c + 4d)/10  <=>
10(a + b + c + d) = 4(a + 2b + 3c + 4d)    <=>
5(a + b + c + d)  = 2(a + 2b + 3c + 4d)    <=>
5a + 5b + 5c + 5d = 2a + 4b + 6c + 8d      <=>
3a + b - c - 3d   = 0

첫 번째와 마지막 주에 같은 합이 있고 두 번째와 세 번째 주에 같은 합이있을 때 한 가지 해결책이 있지만, 이두근이 다를 경우 무한히 많은 해결책이 있습니다. 예 : [15,10,10,10,10,10,5,20,20,20,25,25,20,20,30,20,20,20,20,20,20,10,10,20 , 0,10,10,10]

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


2

자바 스크립트 (Node.js) , 49 바이트

a=>a.map((x,i)=>(I+=d=-~(i/7),s+=x*d),s=I=0)&&s/I

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


비 제네릭 솔루션

자바 스크립트 (Node.js) , 39 36 바이트

a=>a.reduce((s,x,i)=>s+x*-~(i/7))/70

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


1
를 사용하여 첫 번째 솔루션에서 -1 바이트 a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I. 간단한 팁 : <hr>마크 다운에서 수평선을 만드는 데 사용
Herman L

@HermanL 사용하는 데 무엇이 문제입니까 ---(자체 단락 필요)?
Neil


2

Stax , 10 8 바이트

äΔ6◙█µøΓ

실행 및 디버깅

설명 (포장 풀기) :

7/4R:B$:V Full program, implicit input
7/        Split into parts of length 7
  4R      Push [1, 2, 3, 4]
    :B    Repeat each element the corresponding number of times
      $   Flatten
       :V Average

1
Stax를 사용하는 또 다른 제품! 예! $요소가 모두 정수인 경우 평탄화 하는 데 사용할 수 있습니다 ( 지금 OP로 확인).
Khuldraeseth na'Barya


2

, 14 바이트

I∕ΣE⪪A⁷×Σι⊕κ⁷⁰

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

     A          Input array
    ⪪ ⁷         Split into subarrays of length 7
   E            Loop over each subarray
         ι      Subarray
        Σ       Sum
           κ    Loop index
          ⊕     Incremented
       ×        Product
  Σ             Sum results
            ⁷⁰  Literal 70
 ∕              Divide
I               Cast to string
                Implicitly print

2

K4 / K (oK) , 19 16 14 바이트

해결책:

+/(1+&4#7)%70%

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

예:

+/(1+&4#7)%70%50 50 50 50 50 50 50 10 10 10 10 10 10 10 50 50 50 50 50 50 50 50 50 50 50 50 50 50
42

설명:

평가는 오른쪽에서 왼쪽으로 수행됩니다. 7 1s, 7 2s, 7 3s 및 7 4s를 입력으로 70으로 나눕니다. 그런 다음 요약합니다.

+/(1+&4#7)%70% / the solution               
           70% / 70 divided by the input
  (      )%    / the stuff in brackets divided by this...
      4#7      / draw from 7, 4 times => 7 7 7 7
     &         / 'where' builds 7 0s, 7 1s, 7 2s, 7 3s
   1+          / add one
+/             / sum (+) over (/) to get the total

2

엑셀 : 33 바이트

(A1 : N1 및 A2 : N2에서 두 줄로 데이터를 실행하여 @wernisch의 답변에서 3 바이트를 절약했습니다)

=AVERAGE(A1:N2,H1:N2,A2:N2,H2:N2)

이것을 주석으로 포함하지 않은 것에 대해 사과드립니다. 그렇게 할만 큼 평판이 충분하지 않습니다.


2

Japt , 11 10 바이트

xÈ/#F*ÒYz7

시도 해봐


설명

 È             :Pass each element at index Y through a function
  /#F          :  Divide by 70
       Yz7     :  Floor divide Y by 7
      Ò        :  Negate the bitwise NOT of that to add 1
     *         :  Multiply both results
x               :Reduce by addition

1

삼각 , 49 바이트

....)....
...D7)...
..14)21..
.WM)IEtu.
}u)70s/..

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

설명

)D7)14)21WM)IEtu}u)70s/ – Full program.
)D7)14)21               – Push the literals 0, 7, 14, 21 onto the stack.
         WM     }       – Wrap the stack to a list and run each element on a separate
                          stack, collecting the results in a list.
           )IEt         – Crop the elements of the input before those indices.
               u        – Sum that list.
                 u      – Then sum the list of sums.
                  )70   – Push the literal 70 onto the stack.
                     s/ – Swap and divide.


1

APL + WIN, 13 바이트

정수 벡터로 배열을 프롬프트합니다.

(+/⎕×7/⍳4)÷70

설명:

7/⍳4) create a vector comprising 7 1s, 7 2s, 7 3s and 7 4s

+/⎕× prompt for input, multiply by the vector above and sum result

(....)÷70 divide the above sum by 70

1

자바 8, 57 바이트

a->{int r=0,i=35;for(;i-->7;)r+=i/7*a[i-7];return r/70d;}

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

설명:

a->{              // Method with integer-array parameter and double return-type
  int r=0,        //  Result-sum, starting at 0
      i=35;       //  Index-integer, starting at 35
  for(;i-->7;)    //  Loop `i` downwards in the range (35,7]
    r+=           //   Add the following to the result-sum:
       i/7        //    `i` integer-divided by 7,
       *a[i-7];   //    multiplied by the item at index `i-7`
  return r/70d;}  //  Return the result-sum, divided by 70.0

1

J , 16 바이트

70%~1#.]*7#4{.#\

설명:

              #\           finds the lengths of all successive prefixes (1 2 3 4 ... 28)
           4{.             takes the first 4 items (1 2 3 4)
         7#                creates 7 copies of each element of the above list
       ]*                  multiplies the input by the above 
    1#.                    sum
70%~                       divide by 70

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


1

클로저, 48 46 바이트

#(/(apply +(for[i[0 7 14 21]v(drop i %)]v))70)

이것은 mapcat + subvec 조합보다 짧았습니다.


1

TI 기본, 25 바이트

mean(Ansseq(sum(I>{0,7,21,42}),I,1,70

대체 솔루션, 39 바이트

Input L1
For(I,1,70
Ans+L1(I)sum(I>{0,7,21,42
End
Ans/70


1

엑셀, 36 33 바이트

@tsh 덕분에 -3 바이트

=SUM(1:1,H1:AB1,O1:AB1,V1:AB1)/70

첫 번째 행에 입력하십시오 ( A1~ AB1).


아마도 A1:AB1-> 1:1?
tsh

1

줄리아 0.6 , 27 바이트

p->repeat(1:4,inner=7)'p/70

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

repeat호출은 7 1, 7 2 등을 포함하는 28 값의 열 행렬을 형성합니다. 그런 다음을 사용하여 전치 '한 다음 입력을 사용하여 행렬 곱셈을 수행합니다 (여기에서 암시 화). 이것이 1x28 행렬과 28x1 행렬의 행렬 곱셈이기 때문에 우리는 필요한 가중치의 합인 단일 값으로 끝납니다. 70우리의 가중 평균을 얻기 위해 그것을 나눕니다 .

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