Bình quân gia quyền - vấn đề xu hướng báo chí


10

Hãy nói rằng mảng này là số lượng báo chí tôi đã đạt được mỗi ngày trong 28 ngày qua:

[
  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
]

Như bạn có thể thấy, nó đã có xu hướng tăng mạnh trong tuần trước và đó là một phần của dữ liệu này mà tôi quan tâm nhất. Càng xa, tôi càng muốn dữ liệu đó nổi bật ở mức trung bình của tôi 'số lượng báo chí.

Cuối cùng, tôi muốn tính ra một mức 'trung bình' trong đó mỗi tuần có giá trị hơn tuần trước.


Thông tin cơ bản, không phải là một phần của vấn đề này.

Bình thường

Tổng của tất cả các giá trị / số lượng giá trị

Đối với ở trên:

1440/28 = 51.42857142857143


Bình quân gia quyền:

Chia mảng thành 4 nhóm 7 và bắt đầu một mảng mới.

  • Thêm nhóm đầu tiên vào mảng.
  • Thêm nhóm thứ hai vào mảng hai lần.
  • Thêm nhóm thứ ba vào ba lần mảng.
  • Thêm nhóm thứ tư vào mảng bốn lần.

Tính tổng tất cả các mảng mới và chia cho chiều dài của mảng mới .

Đối với ở trên:

Chuyển đổi mảng thành này:

[
  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
]

Sau đó chạy trung bình bình thường trên mảng đó.

4310/70 = 61.57142857142857

Lưu ý rằng nó cao hơn giá trị trung bình bình thường do xu hướng tăng trong tuần trước.


Các quy tắc:

  • Đầu vào là một mảng phẳng gồm 28 số nguyên không âm.
  • Bất kỳ ngôn ngữ nào bạn muốn viết.
  • Xuất một số.
  • Tôi luôn muốn thấy các liên kết TIO .
  • Cố gắng giải quyết vấn đề với số byte nhỏ nhất.
  • Kết quả phải là một số thập phân chính xác đến ít nhất 4 vị trí thập phân (được cắt bớt hoặc làm tròn từ các giá trị trường hợp kiểm tra là tốt) hoặc một phân số chính xác.

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

Trường hợp 1: Xu hướng tăng

[
  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
]

Trung bình bình thường: 51.42857142857143 Trung bình có trọng số: 61.57142857142857

Trường hợp 2: Để lại sự chậm trễ

(Tôi đã có một tuần tồi tệ, nhưng đó là một thời gian trước đây)

[
  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
]

Trung bình bình thường: 40 Trung bình có trọng số: 42

Trường hợp 3: Từ bỏ

Tôi đã có một tuần tồi tệ, nó kéo trung bình của tôi xuống nhanh chóng.

[
  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
]

Trung bình bình thường: 40 Trung bình có trọng số: 34

Trường hợp 4: Tính trung bình

Được rồi, vì vậy tôi chỉ chơi xung quanh đây, tôi nghĩ rằng nó có thể là cùng một giá trị cho mức trung bình bình thường và có trọng số, nhưng, tất nhiên, nó không phải là.

[
  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
]

Trung bình bình thường: 31,25 Trung bình có trọng số: 24,0


Vấn đề tiền thưởng:

Sự kết hợp nào của 28 giá trị sẽ có cùng mức trung bình bình thường và trung bình có trọng số?


Chúc bạn chơi golf vui vẻ!



1
Bạn cũng có thể muốn thử làm mịn theo cấp số nhân - new_avg = α*weekly_sum + (1-α)*old_avgđối với một số ngườiα∈(0,1)
Angs

2
Tôi làm 0báo chí mỗi ngày, vì vậy trung bình có trọng số của tôi giống như trung bình bình thường của tôi.
Neil

@ Nếu bạn không được hưởng lợi từ hệ thống trung bình có trọng số;)
AJFaraday

1
cẩn thận đừng vượt qua: p
Brian H.

Câu trả lời:


3

Husk , 6 byte

AΣΣṫC7

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

Sử dụng mánh khóe Dennis sử dụng để vượt qua trình đệ trình Jelly của tôi. Thay vì lặp lại mỗi lần N lần, nó lấy ra các hậu tố của danh sách các khối, sau khi làm phẳng sẽ mang lại kết quả tương tự, ngoại trừ thứ tự.



5

05AB1E , 8 7 byte

Đã lưu 1 byte nhờ Mr. Xcoder

7ô.s˜ÅA

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

Giải trình

7ô         # split list into groups of 7
  .s       # push suffixes
    ˜      # flatten
     ÅA    # arithmetic mean

@ Mr.Xcoder: Ồ vâng, tôi biết tôi đã thấy một hàm trung bình, nhưng tôi không thể tìm thấy nó: P
Emigna

4

Thạch , 7 byte

s7ṫJFÆm

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

Làm thế nào nó hoạt động

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.

Huh, như vậy x"J$là tương đương với ṫJtrong bối cảnh này. Hấp dẫn!
Ông Xcoder

Sắp xếp Thay vì lặp đi lặp lại các yếu tố của n mảng -thứ n lần, điều này có tất cả các hậu tố. Sau khi làm phẳng, nó tạo ra các phần tử giống nhau, nhưng theo một thứ tự khác.
Dennis

4

R + pryr, 32 28 byte

và cùng một điểm số trung bình hàng tuần sẽ dẫn đến sự bình đẳng của các phương tiện.

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

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

Đã lưu 4 byte bằng cách sử dụng sản phẩm chấm nhờ Giuseppe .

Pure R sẽ có thêm hai byte sử dụng function


Tất nhiên nó sẽ, điều đó quá rõ ràng, bây giờ tôi nghĩ về nó.
AJFaraday

1
28 byte sử dụng sản phẩm chấm thay vìsum
Giuseppe

Tôi đã có 40 byte vớifunction(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe

1
@Giuseppe May mắn là tôi không nhớ weighted.mean. Yêu nó khi Routgolfs Python.
JayCe

4

MATL , 10 byte

7es4:*s70/

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

Tôi chưa đăng câu trả lời MATL từ lâu! Hình tôi có thể tham gia như một phần của LOTM tháng 5 năm 2018 !

Giải trình:

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

Tôi đã có K:7Y"*s70/10 byte là tốt.
Giuseppe

3

Thạch , 9 byte

s7x"J$FÆm

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

Làm thế nào nó hoạt động

s7x "J $ FÆm - Đưa đầu vào từ đối số dòng lệnh đầu tiên và xuất ra STDOUT.
s7 - Chia thành các nhóm 7.
   "- Áp dụng véc tơ (zipwith):
  x J $ - Lặp lại các yếu tố của mỗi danh sách một số lần bằng với chỉ mục của danh sách.
      F - Làm phẳng.
       M - Trung bình số học.

2

Haskell , 35 byte

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

Tiền thưởng: nếu a,b,c,dlà các khoản tiền hàng tuần, trung bình bình thường tương đương với iff trung bình có trọng số:

(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

Một giải pháp là khi tuần đầu tiên và tuần trước có cùng một khoản tiền, và tương tự tuần thứ hai và thứ ba có cùng một khoản tiền, nhưng có vô số giải pháp nếu bắp tay của bạn phụ thuộc vào nó. Ví dụ: [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]

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


2

JavaScript (Node.js) , 49 byte

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

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


Giải pháp không chung chung

JavaScript (Node.js) , 39 36 byte

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

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


1
-1 byte trên giải pháp đầu tiên sử dụng a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I. Và một mẹo nhanh: sử dụng <hr>để tạo một đường ngang trong đánh dấu
Herman L

@HermanL Có gì sai khi sử dụng ---(cần đoạn văn riêng của nó)?
Neil


2

Stax , 10 8 byte

äΔ6◙█µøΓ

Chạy và gỡ lỗi nó

Giải thích (giải nén):

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
Khác sử dụng Stax! Đúng! Bạn có thể sử dụng $để làm phẳng nếu các phần tử là tất cả các số nguyên đang kiểm tra với OP.
Khuldraeseth na'Barya


2

Than , 14 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

     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 byte

Giải pháp:

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

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

Thí dụ:

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

Giải trình:

Đánh giá được thực hiện từ phải sang trái. Chia 7 1s, 7 2s, 7 3s và 7 4s cho 70 chia cho đầu vào; sau đó tổng hợp lại.

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

Excel: 33 byte

(3 byte được lưu từ câu trả lời của @ wernisch bằng cách chạy dữ liệu trên 2 dòng từ A1: N1 và A2: N2)

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

Xin lỗi vì không bao gồm điều này như một bình luận. Tôi không có đủ danh tiếng để làm như vậy.


2

Japt , 11 10 byte

xÈ/#F*ÒYz7

Thử nó


Giải trình

 È             :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

Hình tam giác , 49 byte

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

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

Giải trình

)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

Perl 5 -pa , 28 byte

$\+=$_/70*int$i++/7+1for@F}{

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

Đầu vào là không gian được phân tách chứ không phải phân tách bằng dấu phẩy.


Bạn có $.sẵn như là một số nhân hoàn hảo. Không cần cho$i
TonMedel

1

APL + THẮNG, 13 byte

Lời nhắc cho mảng là một vectơ số nguyên:

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

Giải trình:

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

Java 8, 57 byte

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

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

Giải trình:

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 byte

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

Giải trình:

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

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


1

Clojure, 48 46 byte

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

Điều này đã kết thúc ngắn hơn kết hợp mapcat + subvec.


1

TI-Basic, 25 byte

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

Giải pháp thay thế, 39 byte

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


1

Excel, 36 33 byte

-3 byte nhờ @tsh.

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

Nhập vào hàng đầu tiên ( A1đến AB1).


Có lẽ A1:AB1-> 1:1?
tsh

1

Julia 0,6 , 27 byte

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

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

Cuộc repeatgọi tạo thành một ma trận cột gồm 28 giá trị, chứa bảy 1, rồi bảy 2, v.v. Sau đó, chúng tôi hoán đổi nó với ', sau đó thực hiện phép nhân ma trận với đầu vào (biến đổi được ẩn ở đây). Vì đó là phép nhân ma trận của ma trận 1x28 với ma trận 28x1, chúng tôi kết thúc với một giá trị duy nhất, đó là tổng trọng số mà chúng tôi cần. Chia nó 70để có được ý nghĩa trọng số của chúng tôi.

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.