Fivenum dan sedikit

14

(Paradoks, Paradoks, Paradoks yang paling cerdik)

Ini adalah bagian pertama dari seri multi-bagian yang terinspirasi oleh fungsi R yang berbeda.

Tugas

Mengingat dataset D bilangan bulat positif, aku ingin kau menghitung ringkasan 5 jumlah dari D . Namun, saya sedang bekerja pada dataset besar, jadi saya perlu kode Anda sekecil mungkin, memungkinkan saya untuk menyimpannya di komputer saya.

Ringkasan nomor lima terdiri dari:

  • Nilai minimum
  • Kuartil pertama (Q1)
  • Median / Kuartil kedua (Q2)
  • Kuartil ketiga (Q3)
  • Nilai maksimum

Ada beberapa cara untuk mendefinisikan kuartil, tetapi kita akan menggunakan yang diterapkan oleh R:

Definisi:

  • Minimum dan maksimum: masing-masing nilai terkecil dan terbesar.
  • Median: nilai tengah jika D memiliki jumlah entri ganjil, dan rata-rata aritmatika dari dua nilai paling tengah jika D memiliki jumlah entri genap. Perhatikan bahwa ini berarti median mungkin nilai non-integer. Kami harus Menghitung Median sebelumnya .
  • Kuartil Pertama dan Ketiga: Membagi data menjadi dua bagian, termasuk elemen pusat di setiap setengah jika D memiliki jumlah entri ganjil, dan menemukan nilai median masing-masing setengah. Median bagian bawah adalah Kuartil Pertama, dan median bagian atas adalah Kuartil Ketiga.

Contoh:

D=[1,2,3,4,5] . Median kemudian3 , dan bagian bawah adalah[1,2,3] , menghasilkan kuartil pertama dari2 , dan bagian atas adalah[3,4,5] , menghasilkan kuartil ketiga dari4 .

D=[1,3,3,4,5,6,7,10] . Median adalah4.5 , dan bagian bawah adalah[1,3,3,4] , menghasilkan kuartil pertama dari3 , dan bagian atas adalah[5,6,7,10] , menghasilkan kuartil ketiga dari6.5 .

Aturan tambahan:

  • Input adalah sebagai larik atau padanan terdekat bahasa Anda.
  • Anda dapat menganggap array diurutkan dalam urutan naik atau turun (tapi harap tentukan yang mana).
  • Anda dapat mengembalikan / mencetak hasil dalam urutan yang konsisten , dan dalam format fleksibel apa pun yang Anda suka, tetapi harap tunjukkan urutan dan format dalam jawaban Anda.
  • Fungsi bawaan yang setara dengan fivenumdiizinkan, tetapi harap juga terapkan solusi Anda sendiri.
  • Anda mungkin tidak menganggap masing-masing dari lima angka tersebut akan menjadi bilangan bulat.
  • Penjelasan didorong.
  • Ini , jadi jawaban tersingkat di setiap bahasa menang!

Kasus uji yang dihasilkan secara acak

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
Giuseppe
sumber

Jawaban:

6

R , 7 byte

fivenum

Cobalah online!

Jawaban yang kurang jelas. ;-)

Menariknya, fivenum(x)tidak sama dengan summary(x)bahkan ketika xnumerik, karena kuantil dihitung secara berbeda: fivenumrata-rata pada diskontinuitas, sedangkan summaryinterpolasi. Anda dapat memaksa summaryuntuk berperilaku seperti fivenumdengan opsi quantile.type, tetapi ini masih lebih lama dari

R , 51 byte

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

Cobalah online!

t=2n3(mod4)

Perhatikan bahwa kode sumber fivenumbuilt-in sangat berbeda (dan lebih lama).

Robin Ryder
sumber
Satu-satunya hal yang dapat saya temukan adalah quantilemengembalikan vektor bernama, sementara fivenumtidak disebutkan namanya. Mungkin itu masalah hilir dari mana fivenumdigunakan?
JAD
@ JAD Melampirkan kode di unname()akan menyelesaikannya. Mungkin ada alasan historis?
Robin Ryder
1
Fungsi Anda berbeda dari fivenumuntuk input dengan panjang 3 mod 4, termasuk dua kasus uji.
Nitrodon
@Nitrodon Argh! Terima kasih telah memperhatikan! Seharusnya tidak apa-apa sekarang.
Robin Ryder
5

MATL , 18 byte

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

Urutan output meningkat, seperti dalam kasus uji.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

MATL, seperti MATLAB, menghitung kuantil menggunakan interpolasi linier jika diperlukan (seperti yang ditentukan dalam tantangan untuk median). Untuk mencapai perilaku yang diperlukan untuk kuartil pertama dan ketiga, cukup untuk mengulang median jika panjang input ganjil. Maka hasilnya hanyalah 0, .25, .5, .75 dan 1 kuantil.

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
Luis Mendo
sumber
2

Python 3.8 (pra-rilis) , 66 byte

lambda l:[(l[~-i//4]+l[-~i//4])/2for i in[1,n:=len(l),~n-n,~n,-3]]

Cobalah online!

Input dan output dalam urutan menaik.

Tidak
sumber
1

Python 3.8, 97 byte

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:])]

Ini mengasumsikan bahwa daftar input diurutkan dalam urutan menaik. fadalah fungsi untuk mengembalikan ringkasan 5-angka.

{msayan,mSebuahx,Q1,Q2,Q3}

Saya melepas beberapa byte dengan mengambil beberapa petunjuk dari jawaban FlipTack untuk Compute the Median.

Cobalah online!

Bagaimana cara kerjanya?

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)
mprogrammer
sumber
tidak apa-apa menggunakan fungsi yang menghitung median; pengiriman itu tidak lagi oleh Python (3?), tetapi "paket statistik Python +" atau serupa.
Giuseppe
1

Arang , 33 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Output dalam urutan naik atau turun tergantung pada apakah input dalam urutan naik atau turun. Penjelasan:

≔⊖Lθη

Dapatkan indeks elemen terakhir.

IE

Petakan elemen-elemen dari array berikut dan hasilkan ke string untuk cetakan implisit pada baris yang terpisah.

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

Hitung posisi elemen kuartil, di mana tambahan 0.5menunjukkan bahwa nilainya adalah rata-rata dari dua elemen yang berdekatan.

⊘⁺§θ⌊ι§θ⌈ι

Hitung kuartil di setiap posisi dengan mengambil rata-rata nilai di lantai dan langit-langit posisi.

Neil
sumber
1

C (gcc) , 123 121 119 byte

-2 Berkat ceilingcat.

Mengasumsikan daftar diurutkan dalam urutan menaik.

Output dalam urutan: min, Q1, Q2, Q3, maks.

#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]);}

Cobalah online!

gastropner
sumber
1

05AB1E , 18 byte

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

Output-order adalah: [Q1, Q3, Q2, min, max] .

Cobalah secara online atau verifikasi semua kasus uji . (Saya telah menambahkan semacam {untuk suite tes, sehingga kasus uji lebih mudah untuk diverifikasi dalam urutan[min, Q1, Q2, Q3, max] .)

Penjelasan:

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)
Kevin Cruijssen
sumber