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!

AJFaraday
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
AJFaraday
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.

Tuan Xcoder
sumber
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
Emigna
sumber
@ 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.
Dennis
sumber
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

JayCe
sumber
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
James
sumber
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.
Tuan Xcoder
sumber
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!

Angs
sumber
2

JavaScript (Node.js) , 49 byte

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

Cobalah online!


Solusi non generik

JavaScript (Node.js) , 39 36 byte

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

Cobalah online!

DanielIndie
sumber
1
-1 byte pada solusi pertama menggunakan a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I. Dan tip cepat: gunakan <hr>untuk membuat garis horizontal dalam penurunan harga
Herman L
@HermanL Apa yang salah dengan menggunakan ---(perlu paragraf sendiri)?
Neil
2

Stax , 6 byte

ñI"%"╟

Jalankan dan debug di staxlang.xyz!

Dibongkar (7 byte) dan penjelasan:

7/|]$:V
7/         Split into groups of seven.
  |]       Suffixes
    $:V    Flatten and average. Implicit print as fraction.
Khuldraeseth na'Barya
sumber
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
wastl
sumber
1
Lain menggunakan Stax! Iya! Anda dapat menggunakan $untuk meratakan jika elemen-elemennya semua bilangan bulat — memeriksa dengan OP sekarang.
Khuldraeseth na'Barya
2

Oktaf , 33 byte

@(x)sum(reshape(x,7,4)*(1:4)')/70

Cobalah online!

Luis Mendo
sumber
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
Neil
sumber
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
streetster
sumber
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.

penyebaran informasi atau
sumber
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
Shaggy
sumber
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.
Tuan Xcoder
sumber
1

Perl 5 -pa , 28 byte

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

Cobalah online!

Input dipisahkan oleh spasi daripada dipisahkan koma.

Xcali
sumber
Anda telah $.tersedia sebagai pengganda sempurna. Tidak perlu$i
Ton Hospel
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
Graham
sumber
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
Kevin Cruijssen
sumber
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!

Galen Ivanov
sumber
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.

NikoNyrh
sumber
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
Timtech
sumber
1

Ruby , 65 byte

->r{(b=(0..r.size/7).map{|a|r[a*7..-1]}.flatten).sum/b.size.to_f}

Cobalah online!

lfvt
sumber
Ukuran input ditetapkan untuk diperbaiki pada 28 di sini - sehingga Anda dapat menyimpan beberapa byte dengan hardcoding nilai daripada menggunakan sizeproperti. Cobalah online!
sundar - Reinstate Monica
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).

Wernisch
sumber
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.

sundar - Pasang kembali Monica
sumber