Ağırlıklı ortalama - baskı eğilimi sorunu


10

Diyelim ki bu dizi, son 28 günde her gün kaç tane basım gerçekleştirdiğim:

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

Gördüğünüz gibi, geçen hafta dik bir artış eğilimi var ve bu verilerin en çok ilgilendiğim kısmı. Geçmişte ne kadar fazla olursa, o verilerin ortalama 'basın sayısı.

Bu amaçla, her haftanın bir önceki haftadan daha değerli olduğu bir 'ortalama' çalışmak istiyorum.


Bu sorunun bir parçası değil, arka plan bilgileri.

Normal ortalama:

Tüm değerlerin toplamı / değer sayısı

Yukarıdakiler için:

1440/28 = 51.42857142857143


Ağırlıklı ortalama:

Diziyi 7 kişilik 4 gruba ayırın ve yeni bir dizi başlatın.

  • Diziye ilk grubu ekleyin.
  • İkinci grubu diziye iki kez ekleyin.
  • Üçüncü grubu üç kez diziye ekleyin.
  • Dördüncü grubu diziye dört kez ekleyin.

Tüm yeni diziyi toplayın ve yeni dizinin uzunluğuna bölün .

Yukarıdakiler için:

Diziyi şuna dönüştür:

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

Sonra bu dizide normal bir ortalama çalıştırın.

4310/70 = 61.57142857142857

Geçen haftaki artış eğilimi nedeniyle normal ortalama değerinden daha yüksek olduğunu unutmayın.


Kurallar:

  • Giriş, 28 negatif olmayan tam sayıdan oluşan düz bir dizidir.
  • Yazmak istediğiniz herhangi bir dil.
  • Bir sayı çıkar.
  • Her zaman TIO bağlantılarını görmek isterim .
  • Sorunu en az sayıda baytla çözmeye çalışın.
  • Sonuç, en az 4 ondalık basamağa (test kesesi değerlerinden kesilmiş veya yuvarlanmış) ondalık doğruluk veya kesin bir kesir olmalıdır.

Test senaryoları:

Durum 1: Artış eğilimi

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

Normal ortalama: 51.42857142857143 Ağırlıklı ortalama: 61.57142857142857

Durum 2: Durgunluğu geride bırakmak

(Kötü bir hafta geçirdim, ama bir süre önceydi)

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

Normal ortalama: 40 Ağırlıklı ortalama: 42

Durum 3: Vazgeçmek

Kötü bir hafta geçirdim, ortalamamı hızla aşağı çekiyor.

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

Normal ortalama: 40 Ağırlıklı ortalama: 34

Durum 4: Ortalama alma

Tamam, ben sadece burada oynuyorum, normal ve ağırlıklı ortalamalar için aynı değer olabileceğini düşündüm, ama tabii ki değildi.

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

Normal ortalama: 31.25 Ağırlıklı ortalama: 24.0


Bonus sorunu:

28 değerin hangi kombinasyonu aynı normal ortalama ve ağırlıklı ortalamaya sahip olur?


Mutlu golf!



1
Üstel yumuşatmayı da denemek isteyebilirsiniz - new_avg = α*weekly_sum + (1-α)*old_avgbazıları içinα∈(0,1)
Angs

2
0Her gün baskı yapıyorum , bu yüzden ağırlıklı ortalamam normal ortalamamla aynı.
Neil

@Neil ağırlıklı ortalama sisteminden yararlanamazsınız;)
AJFaraday

1
fazla zorlamamaya dikkat edin: p
Brian H.

Yanıtlar:


3

Kabuk , 6 bayt

AΣΣṫC7

Çevrimiçi deneyin!

Dennis'in Jelly gönderimi geride bıraktığı hileyi kullanır . Her bir yığın N kez tekrarlamak yerine, düzleştirme işleminden sonra, sipariş hariç, aynı sonucu verecek olan parça listesinin soneklerini alır.



5

05AB1E , 8 7 bayt

Bay Xcoder sayesinde 1 bayt tasarruf edildi

7ô.s˜ÅA

Çevrimiçi deneyin!

açıklama

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

@ Mr.Xcoder: Ah evet, ortalama bir işlev gördüğümü biliyordum, ama bulamadım: P
Emigna

4

Jöle , 7 bayt

s7ṫJFÆm

Çevrimiçi deneyin!

Nasıl çalışır

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.

Ha, bu bağlamda x"J$eşdeğerdir ṫJ. İlginç!
Bay Xcoder

Bir çeşit. N- dizisinin öğelerini n kez tekrarlamak yerine, tüm sonekleri alır. Düzleştirdikten sonra aynı elemanları, ancak farklı bir sırayla üretir.
Dennis

4

R + pryr, 32 28 bayt

ve hafta boyunca aynı ortalama puan ortalamaların eşitliğine yol açacaktır.

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

Çevrimiçi deneyin!

Giuseppe sayesinde nokta ürün kullanarak 4 bayt tasarruf etti .

Pure R, iki bayt daha kullanır function


Tabii ki, bu çok açık, şimdi düşünüyorum.
AJFaraday

1
Bunun yerine nokta ürün kullanan 28 baytsum
Giuseppe

40 bayt ilefunction(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe

1
@Giuseppe Neyse ki hatırlamadım weighted.mean. ROutgolfs zaman seviyorum Python.
JayCe


3

Jöle , 9 bayt

s7x"J$FÆm

Çevrimiçi deneyin!

Nasıl çalışır

s7x "J $ FÆm - İlk komut satırı bağımsız değişkeninden girdi alır ve STDOUT'a çıktılar.
s7 - 7 kişilik gruplara bölün.
   "- Vectorized uygula (zipwith):
  x J $ - Her listenin öğelerini, listenin dizinine eşit sayıda tekrarlayın.
      F - Düzleştir.
       Æm - Aritmetik ortalama.

2

Haskell , 35 bayt

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

Bonus: a,b,c,dHaftalık toplamlar ise, normal ortalama ağırlıklı ortalama iff ile aynıdır:

(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

Bir çözüm, ilk ve son haftanın aynı meblağa sahip olduğu ve aynı şekilde ikinci ve üçüncü haftaların da aynı meblağa sahip olduğu, ancak pazılarınız buna bağlıysa sonsuz sayıda çözüm olduğu zaman. Örnek: [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]

Çevrimiçi deneyin!




2

Stax , 10 8 bayt

äΔ6◙█µøΓ

Çalıştır ve hata ayıkla

Açıklama (ambalajsız):

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 kullanan bir başkası! Evet! $Öğelerin tümü tamsayı ise düzleştirmek için kullanabilirsiniz ; şimdi OP ile kontrol edin.
Khuldraeseth na'Barya


2

Odun kömürü , 14 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

     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 bayt

Çözüm:

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

Çevrimiçi deneyin!

Misal:

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

Açıklama:

Değerlendirme sağdan sola yapılır. 7 1s, 7 2s, 7 3s ve 7 4s'yi 70'e bölünerek girişe bölün; sonra özetle.

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

(A1: N1 ve A2: N2'den 2 satırda veri çalıştırarak @ wernisch'in cevabından 3 bayt kaydedildi)

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

Bunu bir yorum olarak eklemediğim için özür dileriz. Bunu yapmak için yeterli itibarım yok.


2

Japt , 11 10 bayt

xÈ/#F*ÒYz7

Dene


açıklama

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

Üçgenlik , 49 bayt

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

Çevrimiçi deneyin!

açıklama

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

Tamsayıların bir vektörü olarak dizi istemleri:

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

Açıklama:

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 bayt

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

Çevrimiçi deneyin.

Açıklama:

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 bayt

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

Açıklama:

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

Çevrimiçi deneyin!


1

Clojure, 48 46 bayt

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

Bu, mapcat + subvec kombinasyonundan daha kısa oldu.


1

TI-Basic, 25 bayt

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

Alternatif çözüm, 39 bayt

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


1

Excel, 36 33 bayt

@Tsh sayesinde -3 bayt.

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

İlk satıra ( A1- AB1) girin.


Belki A1:AB1-> 1:1?
tsh

1

Julia 0.6 , 27 bayt

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

Çevrimiçi deneyin!

repeatÇağrı vb sonra yedi 1'ler, yedi 2 's, Sonra bunu devrik içeren, 28 değerlerin bir sütun matrisi oluşturan 'ardından girişli bir matris çarpma yapmak, (mutiplication burada örtülü olduğu). 28x1 matrisli bir 1x28 matrisin matris çarpımı olduğundan, ihtiyacımız olan ağırlıklı toplam olan tek bir değer elde ederiz. Tarafından bu bölün 70bizim ağırlıklı ortalamasını alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.