คำนวณค่ามัธยฐาน


32

ท้าทาย

รับรายการของจำนวนจริงที่ไม่มีข้อ จำกัด คำนวณค่ามัธยฐาน

คำนิยาม

คำนวณค่ามัธยฐานดังนี้: เรียงลำดับรายการก่อน

  • ถ้าจำนวนรายการเป็นเลขคี่ค่ามัธยฐานคือค่าที่อยู่ตรงกลางของรายการที่เรียงลำดับ
  • มิฉะนั้นค่ามัธยฐานคือค่าเฉลี่ยเลขคณิตของสองค่าที่อยู่ใกล้กับศูนย์กลางของรายการที่เรียง

ตัวอย่าง

[1,2,3,4,5,6,7,8,9] -> 5
[1,4,3,2] -> 2.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5

เราสามารถส่งออกเป็นเศษส่วนได้มากกว่า 2 (เช่น 7/2หรือ8/2)
Wheat Wizard

ตามเศษส่วนนี้เป็นเรื่องปกติ
ข้อบกพร่อง

15
นี่เป็นวิธีที่ไม่ท้าทายหรือไม่
orlp

1
@orlp นี่เป็นส่วนหนึ่งของความท้าทายนี้
AdmBorkBork

3
นอกจากนี้ยังเป็นการท้าทายรหัสที่เร็วที่สุดด้วยเนื่องจากมีอัลกอริธึมเชิงเส้นเวลาที่น่าสนใจ

คำตอบ:


18

Python 2 , 48 ไบต์

ฟังก์ชันที่ไม่มีชื่อซึ่งจะส่งคืนผลลัพธ์ -1 ไบต์ต้องขอบคุณ xnor

lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.

l.sort()ขั้นตอนแรกจะเห็นได้ชัดในการจัดเรียงอาร์เรย์ที่ใช้ อย่างไรก็ตามเราสามารถมีหนึ่งคำสั่งในแลมบ์ดาดังนั้นเราจึงใช้ประโยชน์จากความจริงที่ว่าฟังก์ชั่นการจัดเรียงส่งกลับNoneโดยการเพิ่มor- ตามที่Noneเป็นเท็จใน Python นี้บอกให้ประเมินและส่งกลับส่วนถัดไปของคำสั่ง

ตอนนี้เรามีรายการที่เรียงลำดับแล้วเราจำเป็นต้องค้นหาค่ากลางหรือค่ากลางสองค่า

การใช้เงื่อนไขเพื่อตรวจสอบความเท่าเทียมกันของความยาวนั้นจะละเอียดเกินไปดังนั้นเราจะได้รับดัชนีlen(l)/2และ~len(l)/2:

  • อันแรกคือชั้น (ความยาว / 2)ซึ่งได้รับองค์ประกอบกลางหากความยาวเป็นคี่หรือรายการด้านซ้ายในคู่กลางถ้าความยาวเท่ากัน
  • ประการที่สองคือการผกผันไบนารีของความยาวรายการประเมินเพื่อ-1 - ชั้น (ความยาว / 2) เนื่องจากการจัดทำดัชนีเชิงลบของงูใหญ่สิ่งนี้ทำเช่นเดียวกับดัชนีแรก แต่ย้อนกลับจากจุดสิ้นสุดของอาร์เรย์

หากรายการมีความยาวคี่ดัชนีเหล่านี้จะชี้ไปที่ค่าเดียวกัน หากมีความยาวเท่ากันพวกเขาจะชี้ไปที่กลางสองรายการ

ตอนนี้เรามีดัชนีสองตัวนี้เราจะพบค่าเหล่านี้ในรายการรวมพวกมันแล้วหารด้วย 2 ตำแหน่งทศนิยมต่อท้ายใน/2.ทำให้แน่ใจว่ามันเป็นส่วนทศนิยมแทนการหารจำนวนเต็ม

ผลลัพธ์จะถูกส่งกลับโดยปริยายเนื่องจากเป็นฟังก์ชันแลมบ์ดา

ลองออนไลน์!


ดูเหมือนแลมบ์ดาจะชนะแม้จะซ้ำไปซ้ำมา:lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
xnor

@xnor ขอบคุณ! เมื่อฉันลองทำเช่นนั้นฉันจะนับโดยไม่ได้ตั้งใจf=คิดว่ามันนานกว่า 1 ไบต์
FlipTack

13

Python3 - 31 30 ไบต์

บันทึกเป็นไบต์ด้วย @Dennis!

ฉันไม่ได้วางแผนสำหรับคำตอบในตัว แต่ฉันพบโมดูลนี้และคิดว่ามันยอดเยี่ยมเพราะฉันไม่รู้ว่ามันมีอยู่จริง

from statistics import*;median

ลองมันออนไลน์ได้ที่นี่


6
from statistics import*;medianบันทึกเป็นไบต์
Dennis

@Dennis oh cool สั้นกว่าเสมอไหม
Maltysen

2
มันก็จะเต้นโดยใช้__import__แต่จะเอาชนะimport math;math.log from math import*;log
Dennis


9

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

L‘HịṢµ÷LS

ลองออนไลน์!

คำอธิบาย

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

L          Get the length of the input.
 ‘         Increment it.
  H        Halve it. This gives us the index of the median for an odd-length list
           (Jelly uses 1-based indexing), and a half-integer between the two indices
           we need to average for even-length lists.
   ịṢ      Use this as an index into the sorted input. As explained above this will
           either give us the median (in case of an odd-length list) or a pair of
           values we'll now need to average.
     µ     Starts a monadic chain which is then applied to this median or pair...
      ÷L     Divide by the length. L treats atomic values like singleton lists.
        S    Sum. This also treats atomic values like singleton lists. Hence this
             monadic chain leaves a single value unchanged but will return the
             mean of a pair.

แน่นอนว่าÆṁจะใช้งานได้ในตอนนี้
2560

9

Brain-Flak , 914 + 1 = 915 ไบต์

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}([]<(()())>(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<(())>){((<{}{}([[]]()){({}()()<{}>)}{}(({}){}<([]){{}{}([])}{}>)>))}{}{(<{}([[]]()()){({}()()<{}>)}{}({}{}<([]){{}{}([])}{}>)>)}{}([(({}<((((((()()()){}){}){}()){})[()()()])>)<(())>)](<>)){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({}<>)<{(<{}([{}])>)}{}{(({})<((()()()()()){})>)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})({}<({}<>)<>>((((()()()){}){}){}){})((()()()()()){})<>({}<>)(()()){({}[()]<([([({})](<()>))](<>())){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({})<>)<>{(<{}([{}])>)}{}({}<>)<>({}<><({}<>)>)>)}{}({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<>(({}{}[(())])){{}{}(((<{}>)))}{}{}{(<{}<>([{}])><>)}{}<>}{}>){(<{}(((((()()()()())){}{})){}{})>)}{}

ต้องการให้-Aแฟล็กรัน

ลองออนไลน์!

คำอธิบาย

กระดูกสันหลังของอัลกอริทึมนี้คือการเรียงลำดับฟองที่ฉันเขียนสักครู่ที่ผ่านมา

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}

ฉันจำไม่ได้ว่ามันใช้งานได้อย่างไรดังนั้นอย่าถามฉัน แต่ฉันรู้ว่ามันเรียงลำดับสแต็กและใช้ได้กับฟิล์มเนกาทีฟ

หลังจากเรียงลำดับทุกอย่างแล้วฉันจะหาค่ามัธยฐาน 2 เท่าด้วยอันถัดไป

([]<(()())>(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{}<(())>)  #Stack height modulo 2
{((<{}{}          #If odd
 ([[]]())         #Push negative stack height +1
 {                #Until zero 
  ({}()()<{}>)    #add 2 to the stack height and pop one
 }{}              #Get rid of garbage
 (({}){}<         #Pickup and double the top value
 ([]){{}{}([])}{} #Remove everything on the stack
 >)               #Put it back down
>))}{}            #End if
{(<{}                     #If even
  ([[]]()())              #Push -sh + 2
  {({}()()<{}>)}{}        #Remove one value for every 2 in that value
  ({}{}<([]){{}{}([])}{}>)#Add the top two and remove everything under them
>)}{}                     #End if

ตอนนี้สิ่งที่เหลืออยู่ก็คือให้ทำการแปลงเป็น ASCII

([(({}<((((((()()()){}){}){}()){})[()()()])>)<(())>)](<>)){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({}<>)<
{(<{}([{}])>)}{}  #Absolute value (put "/2" beneath everything)

{                 #Until the residue is zero 
(({})<            #|Convert to base 10
((()()()()()){})  #|
>)                #|...
({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})
({}<({}<>)<>>((((()()()){}){}){}){})((()()()()()){})<>({}<>)
                  #|
(()()){({}[()]<([([({})](<()>))](<>())){({}())<>}{}<>{}{}<>(({})){{}{}<>(<(())>)}{}(({})<>)<>{(<{}([{}])>)}{}({}<>)<>({}<><({}<>)>)>)}{}({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<>(({}{}[(())])){{}{}(((<{}>)))}{}{}{(<{}<>([{}])><>)}{}<>
}{}               #|
>)
{(<{}(((((()()()()())){}{})){}{})>)}{}  #If it was negative put a minus sign

7

R, 6 ไบต์

median

ไม่น่าแปลกใจที่ R ซึ่งเป็นภาษาการเขียนโปรแกรมเชิงสถิติมีสิ่งนี้ในตัว


4
Rbeating Jelly: D: D: D
JAD

5

MATL , 4 ไบต์

.5Xq

สิ่งนี้พบว่า 0.5-quantile ซึ่งเป็นค่ามัธยฐาน

ลองออนไลน์!


ฉันเพิ่งจะคิดออก!
ข้อบกพร่อง

อ่าไม่ฉันหมายถึงฉันกำลังหาวิธีที่จะทำใน MATL =) (แต่ฉันมีวิธีแก้ปัญหา 5 ไบต์ใช่แล้ว ... )
ข้อบกพร่อง

@ flawr โพสต์แล้ว! มันจะน่าสนใจกว่าของฉันอย่างแน่นอน
Luis Mendo

ไม่มันเหมือนกันกับของคุณที่มีฉันอยู่ข้างหน้า :)
ข้อบกพร่อง

@flawr เช่นเดียวกับiที่คุณแนะนำให้ทำโดยนัย? :-P
Luis Mendo

5

Pyth - 11 ไบต์

ค้นหาค่าเฉลี่ยของรายการกลางที่นำมาใช้ทั้งไปข้างหลังและไปข้างหน้า

.O@R/lQ2_BS

Test Suite


5

อ็อกเทฟ 38 ไบต์

@(x)mean(([1;1]*sort(x))(end/2+[0 1]))

สิ่งนี้นิยามฟังก์ชันที่ไม่ระบุชื่อ อินพุตเป็นเวกเตอร์แถว

ลองออนไลน์!

คำอธิบาย

            sort(x)                 % Sort input x, of length k
      [1;1]*                        % Matrix-multiply by column vector of two ones
                                    % This vertically concatenates the sort(x) with 
                                    % itself. In column-major order, this effectively 
                                    % repeats each entry of sort(x)
     (             )(end/2+[0 1])   % Select the entry at position end/2 and the next.
                                    % Entries are indexed in column-major order. Since
                                    % the array has 2*k elements, this picks the k-th 
                                    % and (k+1)-th. Because entries were repeated, for
                                    % odd k this takes the original (k+1)/2-th entry
                                    % (1-based indexing) twice. For even k this takes
                                    % the original (k/2)-th and (k/2+1)-th entries
mean(                            )  % Mean of the two selected entries

1
อืม ... การใช้ " bsxfun" และmean:-) อย่างชาญฉลาด
Stewie Griffin

5

JavaScript, 57 52 ไบต์

v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2

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


1
ฉันพบว่าArray.sort()ไม่สามารถทำงานได้อย่างถูกต้องกับทศนิยม
TrojanByAccident

3
ถ้าคุณผ่านฟังก์ชั่นการเรียงลำดับเหมือนที่ฉันทำ ถ้าคุณเรียกใช้ Array.sort () โดยไม่มีพารามิเตอร์มันจะใช้การเรียงลำดับตัวอักษร
Grax32

น่าสนใจ ไม่ทราบว่า
TrojanByAccident

คุณสามารถบันทึกไม่กี่ไบต์โดยใช้ค่าส่งคืนsort()โดยตรงและกำจัดtตัวแปร:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
Arnauld

1
ไม่ใช่ว่าคุณควรแก้ไขให้ถูกต้อง แต่ถ้าx>=2**31สิ่งนี้จะล้มเหลว >>เป็นสัญญาณแพร่กระจายกะขวาหมายความว่าเมื่อจำนวนจะถูกตีความว่าเป็นจำนวนเต็ม 32 บิตถ้า MSB 2**32>x>=2**31มีการตั้งค่าแล้วมันอยู่ที่การตั้งค่าการทำเชิงลบผลการ สำหรับก็แค่อัตราผลตอบแทนx>=2**32 0
Patrick Roberts เมื่อ

5

Matlab / Octave ขนาด 6 ไบต์

ในตัวที่น่าเบื่อ:

median

ลองออนไลน์!


ฉันลืมกฎสำหรับฟังก์ชั่นที่ไม่ระบุชื่อใน MATLAB / Octave สิ่งนี้ควรเป็น@medianอย่างไร
Giuseppe

@Giuseppe ฉันไม่ทราบว่าวิธีการที่ได้รับการยอมรับในขณะนี้เพื่อคะแนนฟังก์ชั่นในตัว
ข้อบกพร่อง

4

Mathematica ขนาด 6 ไบต์

Median

ทันทีที่ฉันเข้าใจMthmtcaฉันจะโพสต์วิธีแก้ไขปัญหา


ใน Mthmtca 0.1 / 10.1.0.0 รหัสจะมีไบต์CBC8( ËÈ) อย่างไรก็ตามจนกระทั่งฉันใช้แพตช์อื่นความคิดของการเรียกฟังก์ชั่นอาจไม่เป็นไปตามมาตรฐานของ PPCG
LegionMammal978

4

Perl 6 , 31 ไบต์

*.sort[{($/=$_/2),$/-.5}].sum/2

ลองมัน

ขยาย:

*\     # WhateverCode lambda ( this is the parameter )

.sort\ # sort it

[{     # index into the sorted list using a code ref to calculate the positions

  (
    $/ = $_ / 2 # the count of elements divided by 2 stored in 「$/」
  ),            # that was the first index

  $/ - .5       # subtract 1/2 to get the second index

                # indexing operations round down to nearest Int
                # so both are effectively the same index if given
                # an odd length array

}]\

.sum / 2        # get the average of the two values


4

APL (Dyalog Unicode)ขนาด 14 ไบต์

≢⊃2+/2/⊂∘⍋⌷÷∘2

ลองออนไลน์!

นี่คือรถไฟ dfn {(2+/2/⍵[⍋⍵])[≢⍵]÷2}เดิม

รถไฟมีโครงสร้างดังนี้

┌─┼───┐
  ┌─┼───┐
    2 / ┌─┼───┐
    ┌─┘ 2 / ┌─┼─┐
    +         
           ┌┴┐ ┌┴┐
             ÷ 2

หมายถึงอาร์กิวเมนต์ที่ถูกต้อง

ดัชนี

  • ⊂∘⍋ดัชนีที่จัดทำดัชนีเป็นผลลัพธ์จะถูกจัดเรียง

  • ÷∘2เข้าไปโดยแบ่งออกเป็น 2

2/ทำซ้ำสองครั้งดังนั้น1 5 7 8จะกลายเป็น1 1 5 5 7 7 8 8

2+/ รับผลรวมคู่นี้กลายเป็น (1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)

จากตัวเลือกนี้

  • องค์ประกอบที่มีดัชนีเท่ากับความยาวของ

โซลูชั่นก่อนหน้า

{.5×+/(⍵[⍋⍵])[(⌈,⌊).5×1+≢⍵]}
{+/(2/⍵[⍋⍵]÷2)[0 1+≢⍵]}
{+/¯2↑(1-≢⍵)↓2/⍵[⍋⍵]÷2}
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
{(≢⍵)⊃2+/2/⍵[⍋⍵]÷2}
≢⊃2+/2/2÷⍨⊂∘⍋⌷⊢
≢⊃2+/2/⊂∘⍋⌷÷∘2

3

เสียงกระเพื่อมสามัญ, 89

(lambda(s &aux(m(1-(length s)))(s(sort s'<)))(/(+(nth(floor m 2)s)(nth(ceiling m 2)s))2))

ฉันคำนวณค่าเฉลี่ยขององค์ประกอบที่ตำแหน่ง(floor middle)และ(ceiling middle)ซึ่งmiddleเป็นดัชนี zero-based สำหรับองค์ประกอบกลางของรายการที่เรียงลำดับ มันเป็นไปได้สำหรับmiddleการเป็นจำนวนเต็มเช่น1สำหรับรายการป้อนข้อมูลของขนาด 3 เช่น(10 20 30)หรือส่วนสำหรับรายการที่มีแม้ตัวเลขขององค์ประกอบเช่นสำหรับ3/2 (10 20 30 40)ในทั้งสองกรณีเราคำนวณค่ามัธยฐานที่คาดไว้

(lambda (list &aux
             (m (1-(length list)))
             (list (sort list #'<)))
  (/ (+ (nth (floor m 2) list)
        (nth (ceiling m 2) list))
     2))

3

เป็นกลุ่ม 62 ไบต์

ฉันทำสิ่งนี้ใน V โดยใช้การจัดการข้อความอย่างเดียวจนกระทั่งสิ้นสุด แต่รู้สึกผิดหวังกับการจัดการ [X] และ [X, Y] ดังนั้นนี่เป็นเวอร์ชั่นที่ง่าย พวกมันมีความยาวเท่ากัน

c$:let m=sort(")[(len(")-1)/2:len(")/2]
=(m[0]+m[-1])/2.0

ลองออนไลน์!

Unprintables:

c$^O:let m=sort(^R")[(len(^R")-1)/2:len(^R")/2]
^R=(m[0]+m[-1])/2.0

รางวัลชมเชย:

  • ^O นำคุณออกจากโหมดแทรกสำหรับคำสั่งเดียว (คำสั่ง let)
  • ^R" แทรกข้อความที่ถูกดึง (ในกรณีนี้คือรายการ)

3

TI-Basic, 2 ไบต์

median(Ans

ตรงไปตรงมามาก


2
Ansไม่ได้เป็นได้รับอนุญาตให้ฉันวิธีการ / O
Mego

1
@ ลิงก์และความคิดเห็นของคุณทำให้ฉันสับสน ... ตามการลงคะแนนจะอนุญาต ฉันพลาดอะไรไปรึเปล่า?
Patrick Roberts

@PatrickRoberts มีการถกเถียงกันบ้างเกี่ยวกับเกณฑ์การยอมรับ ผู้ใช้หลายคน (รวมตัวฉันเอง) ปฏิบัติตามกฎที่วิธีการนั้นต้องการอย่างน้อย +5 และอย่างน้อยสองครั้งมากขึ้นเป็น upvotes ซึ่งเป็นกฎที่ระบุไว้ แต่เดิมในโพสต์นั้น (มันถูกลบตั้งแต่) และเป็นไปตามกฎ สำหรับช่องโหว่มาตรฐาน
Mego

ใครก็ตามที่ลบความคิดเห็นของฉันสองครั้งจากโพสต์ของตัวเองนั้นน่ารำคาญ เนื่องจากไม่มีกฎที่ยอมรับอย่างชัดเจนเกี่ยวกับการยอมรับฉันไม่เห็นปัญหาที่นี่ คุณสามารถดูคำตอบของฉันเกี่ยวกับ SO สำหรับวิธีการนี้ใช้เป็นข้อโต้แย้งกับโปรแกรม
Timtech

@Mego +38 มากกว่าสองครั้ง -18
Timtech

3

C #, 126 ไบต์

using System.Linq;float m(float[] a){var x=a.Length;return a.OrderBy(g=>g).Skip(x/2-(x%2==0?1:0)).Take(x%2==0?2:1).Average();}

ค่อนข้างตรงไปตรงมาที่นี่กับ LINQ เพื่อสั่งซื้อค่าข้ามรายการครึ่งหนึ่งรับหนึ่งหรือสองค่าขึ้นอยู่กับคู่ / คี่และค่าเฉลี่ย


คุณต้องรวมusing System.Linq; เข้าไปในจำนวนไบต์ แต่คุณสามารถยกเลิกสิ่งนี้ได้โดยทำการเปลี่ยนแปลงบางอย่าง คอมไพล์ a Func<float[], float>และกำหนดค่าของ modulo ให้กับตัวแปร 106 ไบต์:using System.Linq;a=>{int x=a.Length,m=x%2<1?1:0;return a.OrderBy(g=>g).Skip(x/2-m).Take(++m).Average();};
TheLethalCoder

@TheLethalCoder ฉันไม่เคยแน่ใจว่าสิ่งที่ถือเป็นโปรแกรมที่สมบูรณ์ คุณพูดถูกเกี่ยวกับการใช้ การต่อการประกาศโมดูลัสกับความยาวก็เป็นความคิดที่ดีเช่นกัน ฉันทดลองกับมันเล็กน้อย แต่ก็ไม่สามารถทำให้สั้นลงกว่านี้อีกแล้ว ฉันอยากจะบอกว่าการเพิ่มประสิทธิภาพของคุณนั้นคุ้มค่ากับคำตอบเพราะมันค่อนข้างสำคัญและฉันจะไม่มากับพวกเขา
Jens

ความท้าทายไม่ได้ระบุว่าคุณต้องการโปรแกรมเต็มรูปแบบดังนั้นวิธีการที่ไม่ระบุชื่อก็ใช้ได้ ยิ่งไปกว่านั้นฉันได้กล่าวถึงเคล็ดลับทั่วไปเกี่ยวกับการเล่นกอล์ฟดังนั้นฉันไม่จำเป็นต้องเพิ่มคำตอบแค่เล่นกอล์ฟของคุณเอง!
TheLethalCoder

3

C ++ 112 ไบต์

ขอบคุณ @ original.legin ที่ช่วยฉันบันทึกไบต์

#include<vector>
#include<algorithm>
float a(float*b,int s){std::sort(b,b+s);return(b[s/2-(s&1^1)]+b[s/2])/2;}

การใช้งาน:

    int main()
    {
        int n = 4;
        float e[4] = {1,4,3,2};
        std::cout<<a(e,n); /// Prints 2.5

        n = 9;
        float e1[9] = {1,2,3,4,5,6,7,8,9};
        std::cout<<a(e1,n); /// Prints 5

        n = 13;
        float e2[13] = {1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4};
        std::cout<<a(e2,n); /// Prints 1.5

        return 0;
    }

1
คุณสามารถใช้floatแทนdoubleการบันทึกสองไบต์ นอกจากนี้ใน GCC คุณสามารถใช้#import<vector>และแทน#import<algorithm> #include(โปรดทราบว่าคุณไม่ต้องการช่องว่างหลังจาก#includeหรือ#import)
Steadybox

@ Steadybox ฉันไม่ได้นับคะแนนทั้งสองรวมไว้ในคะแนน ฉันควร? นอกจากนี้ฉันส่วนใหญ่ใช้ Clang ดังนั้นฉันจึงไม่ค่อยรู้เรื่อง GCC มากนัก แต่ขอบคุณ
ลุยไทเลอร์

ใช่รวมถึงควรรวมอยู่ในการนับไบต์หากรหัสไม่ได้รวบรวมโดยที่พวกเขา
Steadybox

3

J , 16 14 ไบต์

2%~#{2#/:~+\:~

ลองออนไลน์!

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

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

2%~#{2#/:~+\:~
                Input: array of length n
       /:~      Sort ascending
           \:~  Sort descending
          +     Add the two element-wise
     2#         Duplicate each element
   #{           Take n-th element
2%~             Halve

คำตอบก่อนหน้า

Jกับstatsaddon, 18 ไบต์

load'stats'
median

ลองออนไลน์!

ฟังก์ชั่นห้องสมุด FTW

medianการติดตั้งของมีลักษณะดังนี้:

J , 31 ไบต์

-:@(+/)@((<.,>.)@(-:@<:@#){/:~)

ลองออนไลน์!

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

-:@(+/)@((<.,>.)@(-:@<:@#){/:~)
         (<.,>.)@(-:@<:@#)       Find center indices:
                  -:@<:@#          Compute half of given array's length - 1
          <.,>.                    Form 2-element array of its floor and ceiling
                          {/:~   Extract elements at those indices from sorted array
-:@(+/)                          Sum and half

การเล่นกอล์ฟสักนิดให้สิ่งนี้:

J , 28 ไบต์

2%~[:+/(<.,>.)@(-:@<:@#){/:~

ลองออนไลน์!


1
ทำได้ดีมากพอร์ต J ของคำตอบ APL ของฉันจะอยู่#{0,2+/\2#-:/:]ที่ 15 ไบต์ (คนที่ฉันพลาด⎕io)
Kritixi Lithos

2

J, 19 ไบต์

<.@-:@#{(/:-:@+\:)~

คำอธิบาย:

        (        )~   apply monadic argument twice to dyadic function 
         /:           /:~ = sort the list upwards
               \:     \:~ = sort the list downwards
           -:@+       half of sum of both lists, element-wise
<.@-:@#               floor of half of length of list
       {              get that element from the list of sums

คุณสามารถบันทึกไบต์โดยการเอาวงเล็บและการประยุกต์ใช้~โดยตรงกับแต่ละ<.@-:@#{/:~-:@+\:~
ไมล์

2

JavaScript, 273 ไบต์

function m(l){a=(function(){i=l;o=[];while(i.length){p1=i[0];p2=0;for(a=0;a<i.length;a++)if(i[a]<p1){p1=i[a];p2=a}o.push(p1);i[p2]=i[i.length-1];i.pop()}return o})();return a.length%2==1?l[Math.round(l.length/2)-1]:(l[Math.round(l.length/2)-1]+l[Math.round(l.length/2)])/2}

2

Java 7, 99 ไบต์

แข็งแรงเล่นกอล์ฟ:

float m(Float[]a){java.util.Arrays.sort(a);int l=a.length;return l%2>0?a[l/2]:(a[l/2-1]+a[l/2])/2;}

Ungolfed:

float m(Float[] a)
{
    java.util.Arrays.sort(a);
    int l = a.length;
    return l % 2 > 0 ? a[l / 2] : (a[l / 2 - 1] + a[l / 2]) / 2;
}

ลองออนไลน์


ฉันผิดหวังเล็กน้อยแม้ Java 7 จะมีไวยากรณ์การเรียงลำดับที่สั้นพอที่en.wikipedia.org/wiki/…เป็นสิ่งที่ไม่ดี
JollyJoker

คุณไม่จำเป็นต้องนับการนำเข้าjava.util.Arraysใช่หรือไม่
FlipTack

อ๊ะขอบคุณสำหรับการสังเกต :)
Peech

สวัสดีจากอนาคต! คุณสามารถบันทึก 14 ไบต์ได้โดยใช้การตัดส่วนจำนวนเต็มเพื่อจัดการความยาวแบบคู่ ดูของฉัน Java 8 คำตอบ
จา

2

Pari / GP - 37 39ไบต์

ให้เป็น rowvector ที่มีค่า

b=vecsort(a);n=#b+1;(b[n\2]+b[n-n\2])/2  \\ 39 byte              

n=1+#b=vecsort(a);(b[n\2]+b[n-n\2])/2    \\ obfuscated but only 37 byte

เนื่องจาก Pari / GP เป็นแบบโต้ตอบจึงไม่จำเป็นต้องมีคำสั่งเพิ่มเติมเพื่อแสดงผลลัพธ์


สำหรับลิงก์"ลองออนไลน์ได้"จะมีการเพิ่มบรรทัดก่อนและหลัง หากต้องการพิมพ์ผลมัธยฐานจะถูกเก็บไว้ในตัวแปรw

a=vector(8,r,random(999))           
n=1+#b=vecsort(a);w=(b[n\2]+b[n-n\2])/2      
print(a);print(b);print(w)       

ลองออนไลน์!


2

Japt, 20 ไบต์

n gV=0|½*Ul)+Ug~V)/2

ทดสอบออนไลน์! Japt ขาดตัวในตัวที่จำเป็นในการสร้างคำตอบสั้น ๆ สำหรับความท้าทายนี้ ...

คำอธิบาย

n gV=0|½*Ul)+Ug~V)/2  // Implicit: U = input list
n                     // Sort U.
   V=0|½*Ul)          // Set variable V to floor(U.length / 2).
  g                   // Get the item at index V in U.
            +Ug~V     // Add to that the item at index -V - 1 in U.
                 )/2  // Divide by 2 to give the median.
                      // Implicit: output result of last expression

2

Java 8, 71 ไบต์

ความเท่าเทียมกันคือความสนุก! นี่เป็นแลมบ์ดาจากไปdouble[]Double

l->{java.util.Arrays.sort(l);int s=l.length;return(l[s/2]+l[--s/2])/2;}

ไม่มีอะไรซับซ้อนเกินไปเกิดขึ้นที่นี่ อาร์เรย์ได้รับการจัดเรียงแล้วฉันหาค่าเฉลี่ยของตัวเลขสองตัวจากอาร์เรย์ มีสองกรณี:

  • หากความยาวเป็นเลขคู่หมายเลขนั้นจะถูกนำมาจากด้านหน้าของแถวกลางและจำนวนที่สองจะถูกนำมาจากตำแหน่งก่อนหน้านั้นด้วยการหารจำนวนเต็ม ค่าเฉลี่ยของตัวเลขเหล่านี้คือค่ามัธยฐานของอินพุต
  • หากความยาวเป็นเลขคี่sและs-1ทั้งคู่หารดัชนีขององค์ประกอบกลาง ตัวเลขจะถูกเพิ่มเข้าไปในตัวมันเองและผลลัพธ์จะถูกหารด้วยสองทำให้ได้ค่าเดิม

ลองใช้ออนไลน์


2

SmileBASIC ขนาด 45 ไบต์

DEF M A
L=LEN(A)/2SORT A?(A[L-.5]+A[L])/2
END

รับค่าเฉลี่ยขององค์ประกอบที่พื้น (ความยาว / 2) และชั้น (ความยาว / 2-0.5) ง่ายมาก แต่ฉันสามารถบันทึก 1 ไบต์โดยการย้ายสิ่งต่าง ๆ รอบ ๆ :

DEF M A
SORT A    <- extra line break
L=LEN(A)/2?(A[L-.5]+A[L])/2
END

2

Huskขนาด 10 ไบต์

½ΣF~e→←½OD

ลองออนไลน์!

คำอธิบาย

[a1aN][a1a1aNaN]

½ΣF~e→←½OD  -- example input: [2,3,4,1]
         D  -- duplicate: [2,3,4,1,2,3,4,1]
        O   -- sort: [1,1,2,2,3,3,4,4]
       ½    -- halve: [[1,1,2,2],[3,3,4,4]]
  F         -- fold the following
   ~        -- | compose the arguments ..
     →      -- | | last element: 2
      ←     -- | | first element: 3
    e       -- | .. and create list: [2,3]
            -- : [2,3]
 Σ          -- sum: 5
½           -- halve: 5/2

แต่น่าเสียดาย½สำหรับรายการมีชนิด[a] -> [[a]]และไม่ได้[a] -> ([a],[a])ซึ่งไม่อนุญาตให้F~+→←ตั้งแต่foldl1ความต้องการฟังก์ชั่นของชนิดเป็นอาร์กิวเมนต์แรกบังคับให้ฉันใช้a -> a -> ae



2

GolfScript , 27 25 20 17 ไบต์

~..+$\,(>2<~+"/2"

รับอินพุตเป็นอาร์เรย์ของจำนวนเต็มบน stdin ส่งออกเป็นเศษส่วนที่ไม่ได้ลดลง ลองออนไลน์!

คำอธิบาย

ll1l

~                  Evaluate input (converting string -> array)
 ..                Duplicate twice
   +               Concatenate two of the copies
    $              Sort the doubled array
     \,            Swap with the non-doubled array and get its length: l
       (           Decrement: l-1
        >          Array slice: all elements at index (l-1) and greater
         2<        Array slice: first two elements (originally at indices l-1 and l)
           ~       Dump array elements to stack
            +      Add
             "/2"  Push that string
                   Output all items on stack without separator

10/2การส่งออกจะเป็นสิ่งที่ชอบ

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