Rata-rata tertimbang - masalah tren pers


10

Katakanlah array ini adalah berapa banyak press-up yang saya capai setiap hari dalam 28 hari terakhir:

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

Seperti yang Anda lihat, ini mengambil tren kenaikan yang tajam pada minggu lalu, dan itulah bagian dari data ini yang paling saya minati. Semakin jauh di masa lalu, semakin sedikit yang saya inginkan agar data ditampilkan dalam rata-rata saya 'Jumlah press-up.

Untuk itu, saya ingin mencari 'rata-rata' di mana setiap minggu bernilai lebih dari minggu sebelumnya.


Informasi latar belakang, bukan bagian dari masalah ini.

Rata-rata normal:

Jumlah semua nilai / jumlah nilai

Untuk di atas:

1440/28 = 51.42857142857143


Rata-rata tertimbang:

Membagi array menjadi 4 kelompok 7, dan memulai array baru.

  • Tambahkan grup pertama ke array.
  • Tambahkan grup kedua ke array dua kali.
  • Tambahkan grup ketiga ke array tiga kali.
  • Tambahkan grup keempat ke array empat kali.

Jumlahkan semua array baru, dan bagi dengan panjang array baru .

Untuk di atas:

Konversi array menjadi ini:

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

Kemudian jalankan rata-rata normal pada array itu.

4310/70 = 61.57142857142857

Perhatikan bahwa ini lebih tinggi dari nilai rata-rata normal karena tren kenaikan dalam minggu terakhir.


Aturan:

  • Input adalah array datar dari 28 bilangan bulat non-negatif.
  • Bahasa apa pun yang ingin Anda tulis.
  • Keluarkan angka.
  • Saya selalu suka melihat tautan TIO .
  • Cobalah untuk memecahkan masalah dalam jumlah byte terkecil.
  • Hasilnya harus menjadi desimal akurat untuk setidaknya 4 tempat desimal (baik terpotong atau dibulatkan dari nilai-nilai kasus uji baik-baik saja) atau fraksi yang tepat.

Kasus uji:

Kasus 1: Tren naik

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

Rata-rata normal: 51.42857142857143 Rata-rata tertimbang: 61.57142857142857

Kasus 2: Meninggalkan jeda di belakang

(Saya mengalami minggu yang buruk, tapi itu beberapa waktu yang lalu)

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

Rata-rata normal: 40 Rata-rata tertimbang: 42

Kasus 3: Menyerah

Saya mengalami minggu yang buruk, ini menurunkan rata-rata saya dengan cepat.

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

Rata-rata normal: 40 Rata-rata tertimbang: 34

Kasus 4: Rata-rata keluar

Oke, jadi saya hanya bermain-main di sini, saya pikir itu mungkin nilai yang sama untuk rata-rata normal dan tertimbang, tetapi, tentu saja, tidak.

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

Rata-rata normal: 31.25 Rata-rata tertimbang: 24.0


Masalah bonus:

Kombinasi 28 nilai apa yang akan memiliki rata-rata normal dan rata-rata tertimbang yang sama?


Selamat bermain golf!



1
Anda mungkin ingin mencoba smoothing eksponensial juga - new_avg = α*weekly_sum + (1-α)*old_avguntuk beberapaα∈(0,1)
Angs

2
Saya melakukan 0press-up setiap hari, jadi rata-rata tertimbang saya sama dengan rata-rata normal saya.
Neil

@Neil Anda tidak akan mendapat manfaat dari sistem rata-rata tertimbang;)
AJFaraday

1
berhati-hatilah untuk tidak berlatih berlebihan: p
Brian H.

Jawaban:


3

Sekam , 6 byte

AΣΣṫC7

Cobalah online!

Menggunakan trik yang digunakan Dennis untuk mengalahkan pengajuan Jelly saya. Alih-alih mengulangi setiap potongan N kali, ia mengambil sufiks dari daftar potongan, yang setelah diratakan akan menghasilkan hasil yang sama, kecuali untuk pesanan.



5

05AB1E , 8 7 byte

Disimpan 1 byte berkat Tn. Xcoder

7ô.s˜ÅA

Cobalah online!

Penjelasan

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

@ Mr.Xcoder: Oh ya, saya tahu saya telah melihat fungsi yang kejam, tetapi saya tidak dapat menemukannya: P
Emigna

4

Jelly , 7 byte

s7ṫJFÆm

Cobalah online!

Bagaimana itu bekerja

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, begitu x"J$juga dengan ṫJkonteks ini. Menarik!
Tn. Xcoder

Semacam. Alih-alih mengulangi elemen dari n array yang -th n kali, ini mengambil semua akhiran. Setelah merata, itu menghasilkan elemen yang sama, tetapi dalam urutan yang berbeda.
Dennis

4

R + pryr, 32 28 byte

dan skor rata-rata yang sama dari minggu ke minggu akan menghasilkan persamaan cara.

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

Cobalah online!

Disimpan 4 byte dengan menggunakan produk titik terima kasih Giuseppe .

Pure R akan menggunakan dua byte lagi function


Tentu saja, itu sudah sangat jelas, sekarang saya memikirkannya.
AJFaraday

1
28 byte menggunakan produk titik bukannyasum
Giuseppe

Saya punya 40 byte denganfunction(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe

1
@ Giuseppe Untungnya saya tidak ingat weighted.mean. Senang ketika Routgolf Python.
JayCe

4

MATL , 10 byte

7es4:*s70/

Cobalah online!

Sudah lama saya tidak mengirimkan jawaban MATL! Kupikir aku mungkin berpartisipasi sebagai bagian dari LOTM Mei 2018 !

Penjelasan:

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

Saya punya K:7Y"*s70/10 byte juga.
Giuseppe

3

Jelly , 9 byte

s7x"J$FÆm

Cobalah online!

Bagaimana itu bekerja

s7x "J $ FÆm - Mengambil input dari argumen baris perintah pertama dan output ke STDOUT.
s7 - Membagi menjadi 7 kelompok.
   "- Terapkan vectorised (zipwith):
  x J $ - Ulangi elemen dari setiap daftar beberapa kali sama dengan indeks daftar.
      F - Ratakan.
       Æm - Rata-rata aritmatika.

2

Haskell , 35 byte

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

Bonus: jika a,b,c,djumlah mingguan, rata-rata normal sama dengan iff rata-rata tertimbang:

(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

Salah satu solusinya adalah ketika minggu pertama dan terakhir memiliki jumlah yang sama, dan juga minggu kedua dan ketiga memiliki jumlah yang sama, tetapi ada banyak solusi yang tak terhingga jika bisep Anda sanggup melakukannya. Contoh: [15,10,10,10,10,10,520,20,20,25,25,20,20,30,20,20,20,20,20,20,10,10,20,20 , 0,10,10,10]

Cobalah online!




2

Stax , 10 8 byte

äΔ6◙█µøΓ

Jalankan dan debug itu

Penjelasan (tidak dikemas):

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
Lain menggunakan Stax! Iya! Anda dapat menggunakan $untuk meratakan jika elemen-elemennya semua bilangan bulat — memeriksa dengan OP sekarang.
Khuldraeseth na'Barya


2

Arang , 14 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

     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

Larutan:

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

Cobalah online!

Contoh:

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

Penjelasan:

Evaluasi dilakukan dari kanan ke kiri. Bagilah 7 1s, 7 2s, 7 3s dan 7 4s dengan 70 dibagi dengan input; lalu jumlahkan.

+/(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 disimpan dari jawaban @ wernisch dengan menjalankan data pada 2 baris dari A1: N1 dan A2: N2)

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

Permintaan maaf karena tidak memasukkan ini sebagai komentar. Saya tidak punya cukup reputasi untuk melakukannya.


2

Japt , 11 , 10 byte

xÈ/#F*ÒYz7

Cobalah


Penjelasan

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

Triangularity , 49 byte

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

Cobalah online!

Penjelasan

)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 byte

Meminta array sebagai vektor bilangan bulat:

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

Penjelasan:

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

Cobalah online.

Penjelasan:

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

Penjelasan:

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

Cobalah online!


1

Clojure, 48 46 byte

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

Ini akhirnya lebih pendek dari kombinasi mapcat + subvec.


1

TI-Basic, 25 byte

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

Solusi alternatif, 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 terima kasih kepada @tsh.

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

Masukkan baris pertama ( A1ke AB1).


Mungkin A1:AB1-> 1:1?
tsh

1

Julia 0,6 , 27 byte

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

Cobalah online!

Itu repeat panggilan membentuk matriks kolom 28 nilai-nilai, berisi tujuh 1, maka tujuh 2 ini, dll Kami kemudian memindahkannya dengan ', kemudian melakukan perkalian matriks dengan input (mutiplication implisit di sini). Karena ini merupakan perkalian matriks dari matriks 1x28 dengan matriks 28x1, kita berakhir dengan nilai tunggal, yang merupakan jumlah tertimbang yang kita butuhkan. Bagilah dengan 70mendapatkan rata-rata tertimbang kami.

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.