Array of Challenges # 3: ค่าเฉลี่ยเคลื่อนที่


16

หมายเหตุ: นี่คือ # 3 ในชุดของความท้าทายการสำหรับความท้าทายก่อนหน้านี้คลิกที่นี่

ค่าเฉลี่ยเคลื่อนที่ของรายการ

ค่าเฉลี่ยเคลื่อนที่ของรายการคือการคำนวณผลในใหม่เรียบออกรายการที่สร้างขึ้นโดยเฉลี่ย sublists ที่ทับซ้อนกันเล็ก ๆ ของเดิม

เมื่อสร้างค่าเฉลี่ยเคลื่อนที่อันดับแรกเราจะสร้างรายการของรายการย่อยที่ทับซ้อนกันโดยใช้ 'ขนาดหน้าต่าง' ที่แน่นอนเลื่อนหน้าต่างนี้ไปทางขวาหนึ่งครั้งในแต่ละครั้ง

ตัวอย่างเช่นเมื่อกำหนดรายการ[8, 4, 6, 2, 2, 4]และขนาดหน้าต่าง3รายการย่อยจะเป็น:

[8,  4,  6,  2,  2,  4]          Sublists:
(         )                  <-  [8, 4, 6]
    (         )              <-  [4, 6, 2]
        (         )          <-  [6, 2, 2]
            (         )      <-  [2, 2, 4]

จากนั้นเราคำนวณค่าเฉลี่ยเฉลี่ยของแต่ละรายการย่อยเพื่อให้ได้ผลลัพธ์: [6.0, 4.0, 3.3, 2.7](แต่ละค่าจะปัดเป็นทศนิยมหนึ่งตำแหน่ง)


ความท้าทาย

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับรายชื่อLและจำนวนเต็ม1 ≤ n ≤ยาว (L)คำนวณค่าเฉลี่ยเคลื่อนที่สำหรับLโดยใช้ขนาดของหน้าต่างn

กฎ:

  • โปรแกรมของคุณอาจใช้การแบ่งจำนวนเต็มหรือการหารแบบลอย ในกรณีของการแบ่งลอยอนุญาตให้มีข้อผิดพลาดเล็ก ๆ เนื่องจากข้อ จำกัด ของชนิดข้อมูลตราบใดที่ค่านั้นถูกต้อง
  • คุณสามารถส่งโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น (แต่ไม่ใช่ตัวอย่าง)
  • คุณอาจคิดว่ารายการจะมีจำนวนเต็มบวกเท่านั้น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ!

กรณีทดสอบ

โปรดทราบว่าเพื่อความสะดวกในการอ่านค่าทั้งหมดจะถูกปัดเศษเป็นทศนิยมหนึ่งตำแหน่ง

n=5, [1, 2, 3, 4, 5, 6, 7, 8]      ->      [3, 4, 5, 6]
n=3, [100, 502, 350, 223, 195]     ->      [317.3, 358.3, 256]
n=1, [10, 10, 10]                  ->      [10, 10, 10]
n=3, [10, 20, 30]                  ->      [20]
n=2, [90, 40, 45, 100, 101]        ->      [65, 42.5, 72.5, 100.5]

เราจำเป็นต้องปัดเศษค่าลอยหรือเราสามารถปล่อยพวกเขาเป็นอย่างไร
caird coinheringaahing

3
@cairdcoinheringaahing ทราบว่าเพื่อความสะดวกในการอ่านค่าทั้งหมดจะถูกปัดเศษทศนิยมหนึ่งตำแหน่ง ในความคิดของฉันคุณสามารถทิ้งพวกเขาไว้อย่างแน่นอน (อย่างน้อยนั่นคือสิ่งที่ฉันเข้าใจ)
Mr. Xcoder

@cairdcoinheringaahing ฉันค่อนข้างเสรีกับ I / O: ค่าจำนวนเต็มหรือค่าลอยคุณอาจปัดถ้าคุณต้องการ แต่ไม่ต้องทำและไม่อนุญาตให้มีข้อผิดพลาดของจุดลอยตัว
FlipTack

มันจะโอเคที่จะคืนเศษส่วนแทนที่จะเป็นตัวเลขทศนิยมหรือไม่?
JungHwan Min

@JungHwanMin หากความถูกต้องภาษาของคุณจะเก็บค่าเป็นเศษส่วนแทนที่จะลอยก็เป็นเรื่องดีที่จะพิมพ์เป็นเศษส่วนที่ถูกต้องในรูปแบบที่ง่ายที่สุด
FlipTack

คำตอบ:



7

ภาษา Wolfram (Mathematica)ขนาด 13 ไบต์

Mathematica มีทุกสิ่งในตัว

MovingAverage

ลองออนไลน์!

ใช้รายการแล้วรัศมี ...


6
MovingAverageಠ _____ ಠฉันปฏิเสธที่จะเชื่อสิ่งนี้
Mr. Xcoder

@cairdcoinheringaahing ใช้ค่าตัวเลข MovingAverageส่งคืนชุดของเศษส่วน ตอนนี้มันได้รับอนุญาตจาก OP แล้วMovingAverageก็น่าจะเพียงพอแล้ว
Mr. Xcoder


7

Dyalog APL ขนาด 4 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Graham

บันทึก 2 ไบต์ด้วย @ jimmy23013

ฉันพูดถึง APL ไม่ใช่ภาษากอล์ฟหรือไม่?

⊢+/÷

ด้วยnด้านขวาหรือ

+/÷⊣

ด้วยLด้านขวา

ลองออนไลน์!

อย่างไร?

÷- หารLด้วยn

⊢+/- ลด+บน windows ของn


ทำไมไม่หาร L ด้วย n ก่อนการลดลง บันทึกไบต์
Graham


หรือ+ / ÷⊣
jimmy23013

@ jimmy23013 ขอบคุณมาก! ฉันลองแบบนั้นก่อนหน้านี้ แต่ต้องพิมพ์อาร์กิวเมนต์ที่ผิดเพราะมันไม่ทำงาน
Uriel

6

Pythonขนาด 48 ไบต์

f=lambda n,l:l[n-1:]and[sum(l[:n])/n]+f(n,l[1:])

ลองออนไลน์!

ฟังก์ชั่นวนซ้ำ สั้นกว่าโปรแกรม (50 ไบต์)

n,l=input()
while l[-n]:print sum(l[:n])/n;l=l[1:]

ลองออนไลน์!

สิ่งนี้จะช่วยประหยัด 2 ไบต์โดยยกเลิกด้วยข้อผิดพลาดในwhileเงื่อนไข



4

Perl 6 , 33 ไบต์

{@^a.rotor($^b=>1-$b)».sum X/$b}

ทดสอบมัน

ขยาย:

{  # bare block with placeholder parameters 「@a」, 「$b」

  @^a                # declare and use first param

  .rotor(            # split it into chunks
    $^b              # declare and use second param
    =>               # pair it with
    1 - $b           # one less than that, negated

  )».sum             # sum each of the sub lists

  X/                 # cross that using &infix:«/»

  $b                 # with the second param
}


4

J, 7 5 ไบต์

]+/\%

ลองออนไลน์!

ใช้nเป็นอาร์กิวเมนต์ที่ถูกต้องและรายการเป็นด้านซ้าย ให้เครดิตกับโซลูชันของ Uriel สำหรับแนวคิดในการทำเพียงการรวมในมัด

คำอธิบาย

]+/\%
    %  Divide list by n
]+/\   Sum on overlapping intervals of size n

โซลูชันก่อนหน้า (7 ไบต์)

(+/%#)\
      \  Apply to overlapping intervals of size n
(+/%#)   Mean
 +/        Sum
   %       Divided by
    #      Length



3

อ็อกเท33 33ไบต์

@(x,n)conv(x,~~(1:n)/n,'valid')

ลองออนไลน์!

คำอธิบาย

Convolution ( conv) เป็นผลรวมถ่วงน้ำหนักที่เคลื่อนไหว หากน้ำหนักถูกเลือกเป็น[1/n, ..., 1/n](ได้รับตาม~~(1:n)/n) ผลที่ได้คือค่าเฉลี่ยเคลื่อนที่ซึ่งมีการ'valid'เก็บรักษาเฉพาะส่วน


2

R , 72 ไบต์

function(l,n)(k=sapply(0:sum(l|1),function(x)mean(l[x+1:n])))[!is.na(k)]

ลองออนไลน์!

คำนวณหน้าต่างmeanทุกขนาด nเมื่อหน้าต่างผ่านขอบlผลลัพธ์จะเป็นNAดังนั้นเราจึงกรองออก

แพ็คเกจ R + สวนสัตว์ขนาด 13 ไบต์

zoo::rollmean

zooแพคเกจ (โครงสร้างพื้นฐานสำหรับ S3 ปกติและผิดปกติเวลา Series) มีจำนวนมากของฟังก์ชั่นที่มีประโยชน์ คุณอาจจะลองมันนี่ (R-ซอ)


2

Japt v2.0a0, 7 ไบต์

ãV ®x÷V

ลองมัน


คำอธิบาย

การป้อนข้อมูลโดยปริยายของอาร์เรย์และจำนวนเต็มUV

ãV

รับส่วนย่อยของที่UมีความยาวV

®

แผนที่เหนือส่วนย่อย

÷V

Vแบ่งแต่ละองค์ประกอบโดย

x

รวมองค์ประกอบทั้งหมด














0

K (oK) , 13 11 ไบต์

วิธีการแก้:

{+/+x':y%x}

ลองออนไลน์!

ตัวอย่าง:

{+/+x':y%x}[3;8 4 6 2 2 4]
6 4 3.3333 2.6667
{+/+x':y%x}[5;1 2 3 4 5 6 7 8]
3 4 5 6

คำอธิบาย:

oK มีในตัวสำหรับการสร้างหน้าต่างบานเลื่อนจากนั้นสรุปอาร์เรย์ผลลัพธ์และหารด้วยการเลื่อนขนาดหน้าต่างเพื่อรับค่าเฉลี่ย:

{+/+x':y%x} / the solution
{         } / lambda function taking x and y as implicit parameters
       y%x  / y (list) by x (sliding array size)
    x':     / sliding window of size x over list y
   +        / flip array (rotate by 90 degrees)
 +/         / sum up array

ดูเหมือนว่าคุณไม่จำเป็นต้องใช้ flip array + และถ้า K มีการเดินทางเหมือน APL คุณสามารถเลื่อนx%[commute]ไปทางซ้ายและวาง parens ได้
Uriel

พลิกเป็นสิ่งจำเป็นเพื่อให้แน่ใจว่ารวมเป็นข้ามมากกว่าลงรายการในแต่ละครั้งและค่อนข้างแน่ใจว่าไม่มีผู้ประกอบการเดินทางที่ไม่มีอะไรน้อยที่จะแนะนำในคู่มือ ไชโย แต่!
streetster

0

DataWeaveขนาด 50 ไบต์

fun s(l,w)=0 to(sizeOf(l)-w)map avg(l[$ to $+w-1])
%dw 2.0
output application/json

fun sma(list: Array<Number>, window: Number) =
  0 to (sizeOf(list) - window)  // generate starting indices of sublists
  map list[$ to $ + window - 1] // generate sublists
  map avg($)                    // calculate averages

---
sma([90, 40, 45, 100, 101], 2)


0

Java 8, 111 ไบต์

a->n->{int l=a.length-n+1,i=0,j;float[]r=new float[l];for(;i<l;r[i++]/=n)for(j=i;j<i+n;r[i]+=a[j++]);return r;}

คำอธิบาย:

ลองที่นี่

a->n->{                 // Method with array and int parameters and float-array return-type
  int l=a.length-n+1,   //  New length of the return-array
      i=0,j;            //  Index-integers
  float[]r=new float[l];//  Return-array
  for(;i<l;             //  Loop (1) from 0 to `l` (exclusive)
      r[i++]/=n)        //    After every iteration, divide the current item by input `n`
    for(j=i;j<i+n;      //   Inner loop (2) from `i` to `i+n` (exclusive)
      r[i]+=a[j++]      //    Sum the result at index `i` with the items of the input-array
    );                  //   End of inner loop (2)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the resulting float-array
}                       // End of method
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.