ค่าเฉลี่ยถ่วงน้ำหนัก - ปัญหาแนวโน้มการกด


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


ค่าเฉลี่ยถ่วงน้ำหนัก:

แบ่งอาร์เรย์ออกเป็น 4 กลุ่มจาก 7 และเริ่มอาร์เรย์ใหม่

  • เพิ่มกลุ่มแรกลงในอาร์เรย์
  • เพิ่มกลุ่มที่สองในอาร์เรย์สองครั้ง
  • เพิ่มกลุ่มที่สามลงในอาร์เรย์สามครั้ง
  • เพิ่มกลุ่มที่สี่ลงในอาร์เรย์สี่ครั้ง

รวมอาเรย์ใหม่ทั้งหมดแล้วหารด้วยความยาวของอาเรย์ใหม่

สำหรับด้านบน:

แปลงอาเรย์เป็น:

[
  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 ค่าใดที่จะมีค่าเฉลี่ยปกติและค่าเฉลี่ยถ่วงน้ำหนักเท่ากัน


มีความสุขในการเล่นกอล์ฟ!


ขอให้เรายังคงอภิปรายนี้ในการแชท
AJFaraday

1
คุณอาจต้องการลองปรับให้เรียบแบบเอ็กซ์new_avg = α*weekly_sum + (1-α)*old_avgα∈(0,1)
โปเนน

2
ฉัน0กดอัพทุกวันดังนั้นค่าเฉลี่ยถ่วงน้ำหนักของฉันจึงเท่ากับค่าเฉลี่ยปกติของฉัน
Neil

@Neil คุณจะไม่ได้รับประโยชน์จากระบบถัวเฉลี่ยถ่วงน้ำหนัก;)
AJFaraday

1
ระวังอย่าให้มากเกินไป: p
Brian H.

คำตอบ:


3

Husk , 6 ไบต์

AΣΣṫC7

ลองออนไลน์!

ใช้เคล็ดลับDennis ที่ใช้ในการเอาชนะการยอมแพ้ Jelly ของฉัน แทนที่จะทำซ้ำแต่ละก้อนNครั้งมันจะดึงส่วนต่อท้ายของรายการชิ้นซึ่งหลังจากการทำให้แบนจะให้ผลลัพธ์เดียวกันยกเว้นลำดับ



5

05AB1E , 8 7 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณMr. Xcoder

7ô.s˜ÅA

ลองออนไลน์!

คำอธิบาย

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

@ Mr.Xcoder: โอ้ใช่ฉันรู้ว่าฉันได้เห็นฟังก์ชั่นเฉลี่ย แต่ฉันไม่สามารถหาได้: P
Emigna

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ในบริบทนี้ ! ที่น่าสนใจ
นาย Xcoder

เรียงจาก แทนที่จะทำซ้ำองค์ประกอบของn -th array nครั้งสิ่งนี้จะใช้คำต่อท้ายทั้งหมด หลังจากแฟบมันจะสร้างองค์ประกอบเดียวกัน แต่ในลำดับที่แตกต่าง
Dennis

4

R + pryr, 32 28 ไบต์

และคะแนนเฉลี่ยสัปดาห์เดียวกันตลอดสัปดาห์จะส่งผลให้เกิดความเท่าเทียมกันของค่าเฉลี่ย

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

ลองออนไลน์!

ที่บันทึกไว้ 4 ไบต์โดยใช้ขอบคุณคูณจุดที่จะจูเซปเป้

Pure R จะมีอีกสองไบต์ใช้ function


แน่นอนว่ามันชัดเจนมากตอนนี้ฉันคิดถึงมัน
AJFaraday

1
28 bytesโดยใช้ dot dot แทนsum
Giuseppe

ฉันมี 40 ไบต์ด้วยfunction(s)weighted.mean(s,rep(1:4,e=7))
Giuseppe

1
@Giuseppe weighted.meanโชคดีที่ผมจำไม่ได้ว่า รักมันเมื่อoutgolfsR Python
JayCe

4

MATL 10 ไบต์

7es4:*s70/

ลองออนไลน์!

ฉันยังไม่ได้โพสต์คำตอบของ MATL ในยุคสมัย! คิดว่าฉันอาจเข้าร่วมเป็นส่วนหนึ่งของLOTM พฤษภาคม 2018 !

คำอธิบาย:

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 ไบต์เช่นกัน
Giuseppe

3

เยลลี่ขนาด 9 ไบต์

s7x"J$FÆm

ลองออนไลน์!

มันทำงานอย่างไร

s7x "J $ FÆm - รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรกและส่งออกไปยัง STDOUT
s7 - แบ่งออกเป็นกลุ่ม 7
   "- ใช้ vectorised (zipwith):
  x J $ - ทำซ้ำองค์ประกอบของแต่ละรายการจำนวนครั้งเท่ากับดัชนีของรายการ
      F - แบน
       Æm - ค่าเฉลี่ยเลขคณิต

2

Haskell , 35 ไบต์

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

โบนัส: หาก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

ทางออกหนึ่งคือเมื่อสัปดาห์แรกและสัปดาห์ที่แล้วมีผลรวมเท่ากันและในสัปดาห์ที่สองและสามมีผลรวมเท่ากัน แต่มีวิธีแก้ปัญหามากมายเหลือเกินหากลูกหนูของคุณไปถึงจุดนั้น ตัวอย , 0,10,10,10]

ลองออนไลน์!


2

JavaScript (Node.js) , 49 ไบต์

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

ลองออนไลน์!


วิธีแก้ปัญหาไม่ใช่ยาชื่อสามัญ

JavaScript (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>เพื่อสร้างเส้นแนวนอนใน markdown
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

Excel: 33 ไบต์

(บันทึก 3 ไบต์จากคำตอบของ @ wernisch โดยเรียกใช้ข้อมูลบน 2 บรรทัดจาก A1: N1 และ A2: N2)

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

ขออภัยที่ไม่รวมสิ่งนี้เป็นความคิดเห็น ฉันไม่มีชื่อเสียงพอที่จะทำเช่นนั้น



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

Java 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

Clojure 48 48ไบต์

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

สิ่งนี้จบลงด้วยความสั้นกว่า mapcat + subvec


1

TI-Basic, 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

Ruby , 65 ไบต์

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

ลองออนไลน์!


ขนาดอินพุตถูกระบุให้คงที่ 28 ที่นี่ - เพื่อให้คุณสามารถบันทึกหลายไบต์ด้วยการเข้ารหัสค่าแทนการใช้sizeคุณสมบัติ ลองออนไลน์!
sundar - Reinstate Monica

1

Excel, 36 33 ไบต์

-3 ไบต์ขอบคุณ @tsh

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

ป้อนข้อมูลในแถวแรก ( A1ถึงAB1)


อาจจะA1:AB1-> 1:1?
tsh

1

Julia 0.6 , 27 bytes

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

ลองออนไลน์!

การrepeatเรียกใช้เป็นเมทริกซ์คอลัมน์ที่มีค่า 28 ค่าซึ่งประกอบด้วยเจ็ด 1 ของแล้วก็เจ็ดสองค่า ฯลฯ จากนั้นเราแปลงมันด้วย'แล้วทำการคูณเมทริกซ์กับอินพุต เนื่องจากเป็นการคูณเมทริกซ์ของ 1x28 เมทริกซ์กับเมทริกซ์ 28x1 เราจึงได้ค่าเดียวซึ่งก็คือผลรวมถ่วงน้ำหนักที่เราต้องการ หารด้วย70การหาค่าเฉลี่ยถ่วงน้ำหนักของเรา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.