Fivenum และเล็กน้อย


14

(เส้นขนาน, เส้นขนาน, เส้นขนานที่แยบยลที่สุด)

นี่เป็นส่วนแรกของซีรีย์หลายส่วนที่ได้รับแรงบันดาลใจจากฟังก์ชั่น R ที่แตกต่างกัน

งาน

ได้รับชุดDของจำนวนเต็มบวกฉันต้องการให้คุณคำนวณรวม 5 จำนวนของDDอย่างไรก็ตามฉันกำลังทำงานกับชุดข้อมูลขนาดใหญ่ดังนั้นฉันต้องการรหัสของคุณให้เล็กที่สุดเท่าที่จะเป็นไปได้ทำให้ฉันสามารถเก็บไว้ในคอมพิวเตอร์ของฉันได้

สรุปหมายเลขห้าประกอบด้วย:

  • ค่าต่ำสุด
  • ควอไทล์แรก (Q1)
  • ค่ามัธยฐาน / ควอไทล์ที่สอง (Q2)
  • ควอไทล์ที่สาม (Q3)
  • ค่าสูงสุด

มีหลายวิธีในการกำหนดควอไทล์ แต่เราจะใช้วิธีที่ถูกใช้โดย R:

คำนิยาม:

  • ต่ำสุดและสูงสุด: ค่าน้อยที่สุดและใหญ่ที่สุดตามลำดับ
  • ค่ามัธยฐาน: ค่ากลางถ้าDมีจำนวนคี่ของรายการและค่าเฉลี่ยเลขคณิตของสองค่ากลางมากที่สุดถ้าDมีจำนวนคู่ของรายการ โปรดทราบว่านี่หมายความว่าค่ามัธยฐานอาจเป็นค่าที่ไม่ใช่จำนวนเต็ม เราได้มีการคำนวณค่ามัธยฐานก่อน
  • ควอไทล์ที่หนึ่งและสาม: แบ่งข้อมูลออกเป็นสองส่วนรวมถึงองค์ประกอบกลางในแต่ละครึ่งถ้าDมีจำนวนคี่ของรายการและหาค่ามัธยฐานของแต่ละครึ่ง ค่ามัธยฐานของครึ่งล่างเป็นควอไทล์แรกและค่ามัธยฐานของครึ่งบนเป็นควอไทล์ที่สาม

ตัวอย่าง:

D=[1,2,3,4,5] ] ค่ามัธยฐานคือ3แล้วและครึ่งล่างคือ[1,2,3]ทำให้ได้ควอไทล์แรกเป็น2และครึ่งบนคือ[3,4,5]ให้ควอไทล์ที่สามของ44

D=[1,3,3,4,5,6,7,10] ] ค่ามัธยฐานคือ4.5และครึ่งล่างคือ[1,3,3,4]ซึ่งให้ควอไทล์แรกเป็น3และครึ่งบนคือ[5,6,7,10]ให้ควอไทล์ที่สามของ6.56.5

กฎเพิ่มเติม:

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

กรณีทดสอบที่สร้างแบบสุ่ม

1 1 1 1 1 2 2 2 2 2 3 3 4 4 4 4 4 5 5 5 -> 1 1.5 2.5 4 5 
1 2 2 2 4 4 5 5 6 7 7 8 9 9 9 9 9 10 10 10 -> 1 4 7 9 10 
2 2 2 6 8 10 15 16 21 22 23 24 26 33 35 38 38 45 46 47 48 -> 2 10 23 38 48 
1 2 9 -> 1 1.5 2 5.5 9 
1 2 3 3 3 4 9 -> 1 2.5 3 3.5 9
1 1 2 5 7 7 8 8 15 16 18 24 24 26 26 27 27 28 28 28 29 29 39 39 40 45 46 48 48 48 48 49 50 52 60 63 72 73 79 85 86 87 88 90 91 93 94 95 95 97 100 -> 1 25 45 76 100
2 2 4 4 6 8 10 11 13 14 14 15 17 21 23 24 26 27 27 28 28 30 31 33 33 34 36 36 38 38 39 40 41 42 42 43 45 45 47 47 47 47 47 48 48 48 50 51 53 53 55 56 56 56 57 57 58 62 62 63 64 64 65 65 66 67 67 67 68 69 69 71 71 71 74 79 80 81 81 81 82 82 83 83 86 86 86 87 89 94 94 94 95 95 97 98 99 100 100 100 -> 2 33.5 54 76.5 100
1 3 3 4 -> 1 2 3 3.5 4
1 3 3 3 4 -> 1 3 3 3 4

คำตอบ:


6

R , 7 ไบต์

fivenum

ลองออนไลน์!

คำตอบที่ชัดแจ้งชัด ;-)

ที่น่าสนใจfivenum(x)คือไม่เทียบเท่ากับsummary(x)แม้ว่าxจะเป็นตัวเลขเมื่อคำนวณปริมาณที่แตกต่างกัน: fivenumค่าเฉลี่ยที่ไม่ต่อเนื่องในขณะที่summaryinterpolates คุณสามารถบังคับsummaryให้ประพฤติเช่นเดียวfivenumกับตัวเลือกquantile.typeแต่ยังคงนานกว่านี้

R , 51 ไบต์

function(x)quantile(x,(0:4)/4,t=2+5*!sum(!!x)%%4-3)

ลองออนไลน์!

t=2n3(พอควร4) )สุจริตตัวเลือกคำจำกัดความของควอนไทล์นี้ค่อนข้างแปลก

โปรดทราบว่าซอร์สโค้ดของfivenumบิวด์อินนั้นแตกต่างกันมาก (และนานกว่านั้น)


สิ่งเดียวที่ฉันหาได้คือquantileคืนค่าเวกเตอร์ที่ตั้งชื่อแล้วในขณะที่fivenumไม่มีชื่อ อาจเป็นปัญหาดาวน์สตรีมของการfivenumใช้งานที่ไหน
JAD

@ JAD การแนบโค้ดในunname()จะช่วยแก้ปัญหานั้นได้ อาจมีเหตุผลทางประวัติศาสตร์หรือไม่
Robin Ryder

1
ฟังก์ชั่นของคุณแตกต่างจากfivenumสำหรับอินพุตของความยาว 3 mod 4 รวมถึงกรณีทดสอบสองกรณี
Nitrodon

@Nitrodon Argh! ขอบคุณที่สังเกต! มันควรจะตกลงตอนนี้
Robin Ryder

5

MATL , 18 ไบต์

tno?t.5Xqh]5:q4/Xq

คำสั่งส่งออกเพิ่มขึ้นเช่นเดียวกับในกรณีทดสอบ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

MATLAB เช่น MATLAB คำนวณควอนไทล์โดยใช้การสอดแทรกเชิงเส้นหากจำเป็น (เช่นเดียวกับที่ระบุในการท้าทายสำหรับค่ามัธยฐาน) เพื่อให้บรรลุพฤติกรรมที่ต้องการสำหรับควอไทล์ที่หนึ่งและสามมันก็เพียงพอแล้วที่จะทำซ้ำค่ามัธยฐานถ้าความยาวของอินพุตเป็นคี่ จากนั้นผลลัพธ์เป็นเพียง 0, .25, .5, .75 และ 1 quantiles

t       % Implicit input: numeric row array. Duplicate
no      % Length, parity
?       % If not zero (that is, if input length is odd)
  .5    %   Push .5
  Xq    %   .5-quantile: median. For even length it behaves as required
  h     %   Concatenate horizontally
]       % End
5:q     % Push [0 1 2 3 4]
4/      % Divide by 4, element-wise: gives [0 .25 .5 .75 1]
Xq      % [0 .25 .5 .75 1]-quantiles. Implicit display



1

Python 3.8, 97 ไบต์

lambda l:[l[0],l[-1]]+[(i[x(i)//2]+i[~x(i)//2])/2for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])]

นี่ถือว่ารายการอินพุตถูกเรียงลำดับจากน้อยไปหามาก fเป็นฟังก์ชั่นเพื่อส่งคืนข้อมูลสรุป 5 หมายเลข

{ม.ผมn,ม.ax,Q1,Q2,Q3}

ฉันเอาออกไม่กี่ไบต์โดยการเอาคำแนะนำบางอย่างจากคำตอบของ FlipTack เพื่อคำนวณค่ามัธยฐาน

ลองออนไลน์!

มันทำงานยังไง?

lambda l:
    [l[0],l[-1]] # The minimum and maximum, because l is assumed to be sorted in ascending order
    +[(i[x(i)//2]+i[~x(i)//2])/2 # This line computes the median...
    for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])] # ...for each of these lists (the first half, the overall list, and the second half)
    # The (x:=len) is an assignment expression from Python 3.8.
    # It assigns the len function to the variable x but also returns len.
    # Therefore, x can be used as len to save a byte (yes, just one byte)

การใช้ฟังก์ชั่นที่คำนวณค่ามัธยฐานนั้นเป็นเรื่องปกติ การส่งนั้นจะไม่ใช้ Python (3) อีกต่อไป แต่ "Python + สถิติแพ็คเกจ" หรือที่คล้ายกัน
Giuseppe

1

ถ่าน 33 ไบต์

≔⊖LθηIE⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧⊘⁺§θ⌊ι§θ⌈ι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เอาต์พุตในลำดับจากน้อยไปมากหรือจากมากไปน้อยขึ้นอยู่กับว่าอินพุตอยู่ในลำดับขึ้นหรือลง คำอธิบาย:

≔⊖Lθη

รับดัชนีองค์ประกอบสุดท้าย

IE

แมปองค์ประกอบของอาร์เรย์ต่อไปนี้และส่งผลลัพธ์ไปยังสตริงสำหรับการพิมพ์โดยปริยายบนบรรทัดแยก

⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧

คำนวณตำแหน่งขององค์ประกอบควอไทล์โดยที่พิเศษ0.5หมายถึงค่าที่เป็นค่าเฉลี่ยของสององค์ประกอบที่อยู่ติดกัน

⊘⁺§θ⌊ι§θ⌈ι

คำนวณควอไทล์ในแต่ละตำแหน่งโดยการหาค่าเฉลี่ยที่พื้นและเพดานของตำแหน่ง



1

C (gcc) , 123 121 119 ไบต์

-2 ขอบคุณแมวเพดาน

ถือว่ารายการเรียงตามลำดับจากน้อยไปหามาก

เอาท์พุทในการสั่งซื้อ: นาที, Q1, Q2, Q3, สูงสุด

#define M(K,x)(K[~-x/2]+K[x/2])/2.,
f(L,n,m)int*L;{m=n-n/2;printf("%d %f %f %f %d",*L,M(L,m)M(L,n)M((L+n/2),m)L[n-1]);}

ลองออนไลน์!


1

05AB1E , 18 ไบต์

2F2äнIR})€ÅmIWsà‚«

[Q1, Q3, Q2, min, max]ขาออกคำสั่งคือ:

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด (ฉันได้เพิ่มการเรียงลำดับ{สำหรับชุดทดสอบดังนั้นกรณีทดสอบจะง่ายต่อการตรวจสอบตามลำดับ[min, Q1, Q2, Q3, max])

คำอธิบาย:

2F                 # Loop 2 times:
  2ä               #  Split the list at the top of the stack into two halves
                   #  (which is the (implicit) input-list in the first iteration)
    н              #  Only leave the first halve
     IR            #  Push the input in reverse
       })          # After the loop: wrap all three lists into a list
                  # For each of the lists:
          Åm       #  Get the middle/median depending on the parity of the size of the list
            I      # Then push the input-list again
             W     # Get the minimum (without popping)
              s    # Swap to get the input-list again
               à   # Get the maximum (by popping the list)
                  # Pair the min-max together to a pair
                 « # And merge both lists together
                   # (after which the result is output implicitly)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.