Berarti Interkuartil


26

Tugas

Diberikan (dengan cara apa pun) dataset titik mengambang yang diurutkan, kembalikan (dengan cara apa pun dan dalam 1 ‰ dari nilai yang benar) mean interkuartil .

Salah satu algoritma yang mungkin

  1. Buang titik terendah dan tertinggi dari titik data.
  2. Hitung rata-rata (jumlah dibagi dengan hitungan) dari titik data yang tersisa.

Catatan: Jika ukuran dataset tidak terbagi rata menjadi empat, Anda harus menimbang titik data yang dibagi oleh sub-set. Lihat Contoh evaluasi 2 di bawah ini.

Contoh evaluasi 1

Diberikan {1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38}

  1. Hitungan data adalah 12, jadi kami menghapus 3 titik data terendah dan tertinggi:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Rata-rata dari 6 titik data yang tersisa:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6.5

Contoh evaluasi 2

Diberikan {1, 3, 5, 7, 9, 11, 13, 15, 17}

  1. Hitung adalah 9, sehingga setiap kuartal memiliki 2¼ titik data:
    { 1, 2, (0,25 × 5), (0,75 × 5), 7, 9, 11, (0,75 × 13), (0,25 × 13), 15, 17 }
  2. Rata-rata dari sisa 4,5 titik data:
    (0.75 × 5 + 7 + 9 + 11 + 0.75 × 13) / 4.5 = 9

Jawaban:


5

Scilab, 8 byte

trimmean

Lihat dokumentasi . Secara default,, discard=50jadi IQM dihitung.

EDIT: Anda tahu, ini adalah jawaban bawaan yang sepele, jadi saya menandainya sebagai CW .


Saya kira ini akan menjadi pemenangnya. Sudah selesai dilakukan dengan baik.
Adám

8

Pyth , 11 10 byte

.O> <lQS * 4Ql
.OsPtc4S * 4

Suite uji.

Bagaimana itu bekerja

Ini empat kali lipat daftar input untuk memastikan bahwa jumlah data habis dibagi 4.

Masih perlu disortir, karena *4berlaku untuk seluruh daftar, bukan untuk masing-masing elemen.

Kemudian, ia membagi daftar menjadi empat bagian yang sama, kemudian menghapus bagian pertama dan terakhir.

Daftar yang tersisa diratakan dan rata-rata diambil.


8

MATL , 12 11 byte

4Y"G"6L)]Ym

Input adalah vektor horizontal, dengan format

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

atau

[1 3 4 5 6 6 7 7 8 8 9 38]

Cobalah online!

Penjelasan

4Y"    % Input horizontal vector implicitly. Repeat each element 4 times (run-length
       % decoding). The resulting array is still sorted.
G"     % Push input, for each: repeat as many times as the input size
  6L)  %   Remove first and last elements, by applying the index "2:end-1"
]      % End for each
Ym     % Compute mean. Display implicitly

Saya tidak mengerti. Bagaimana cara 6L)menghapus elemen pertama dan terakhir? Ketika saya melakukannya, itu mendorong banyak bilangan kompleks.
DJMcMayhem

5
Nomor @DrGreenEggsandIronMan Complex dapat digunakan untuk itu dalam MATL. Unit imajiner adalah singkatan dari akhir array, dan jika ada dua dari tiga angka, mereka menentukan rentang. Jadi [2, -1+i]ketika digunakan sebagai indeks berarti2:end-1
Luis Mendo

7

Snowman , 66 byte

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

Cobalah online!

Menggunakan algoritma yang sama dengan jawaban @LeakyNun .

}         enable variables b, e, and g
vg        read a line of input into b
","aS     split on commas (in-place)
:10sB;aM  convert each element in resulting array to number ("frombase(10)-map")
4aR       repeat the array 4 times
AsO       sort the array
al        take the length and put it in e without consuming b (the array)
`,        swap b and e, then move e to g; now b=length g=array
4nD       divide b by 4 (4 was stored in e, which is why the array was moved)
,`        move the array and length/4 back to their original positions
aG        split the array into groups of length (length/4)
0AaG      take all elements with index >0 (i.e. remove the first element)
al        store the length of the new array in e again
`NdE`     bring it up to b, decrement, and put it back
AaL       take all elements with index <length-1 (i.e. remove last)
1AfL      flatten the array 1 level deep
:nA;      push a block that adds two numbers (to e)
al        store the length of this new array in g
aF        fold b over e (sum the numbers)
,         move g (the length) into e
nD        divide the sum by the length, resulting in the average
tSsP      to-string and print

2
Bahasa ini terlihat mengerikan. Aku menyukainya.
Mego


5

Jelly , 14 13 12 byte

x4ṫL '$ ḣLN $ S ÷ LH 
x4ṫLḊḣLN $ S ÷ LH
x4œs4ḊṖFS ÷ LH

Cobalah online!

Suite uji.

Bagaimana itu bekerja

Ini adalah terjemahan dari jawaban saya dalam Pyth .


Saya cukup yakin ini bisa dipersingkat, karena saya bisa melakukannya di APL.
Adám

@ Adám Silakan posting solusi Anda (sehingga saya dapat menyalin haha)
Leaky Nun

Saya ingin memberi Marinus kesempatan ...
Adám


Cukup peluang setelah lebih dari 9 bulan, tentu saja
Luis Mendo


4

Brachylog , 21 byte

:3jo@4brbcLl/N,L+:N*.

Cobalah online! atau verifikasi beberapa kasus uji

Penjelasan

Ini pada dasarnya adalah algoritma jawaban Pyth @ LeakyNun.

:3j      Append 3 copies of the input to itself
o@4      Sort and split in 4 lists of equal length
brb      Remove the head and the tail of the list of lists
cL       Concatenate the 2 sublists into a list L
l/N,     N is the inverse of the length of L
L+:N*.   Output is the product of N and the sum of the elements of L

Satu-satunya trik kecil yang ada dalam mengalikan dengan kebalikan dari panjang alih-alih membaginya dengan panjang, karena pembagian antara 2 bilangan bulat adalah pembagian bilangan bulat.


3

Oktaf , 44 byte

@(x)mean(reshape(~~(1:4)'*x,[],4)(:,2:3)(:))

Ini mendefinisikan fungsi anonim.

Masukan adalah vektor horisontal.

Cobalah di ideone .

Penjelasan

Vektor horisontal input pertama kali dikalikan matriks ( *) oleh vektor kolom empat yang (dibangun dengan ~~(1:4)'). Hasilnya adalah matriks empat kolom di mana setiap baris adalah salinan dari vektor input. Ini kemudian dibentuk kembali, sambil mempertahankan urutan linier elemen, menjadi matriks 4-kolom ( reshape(...,[],4)). Pusat dua kolom disimpan ( (:,2:3)) dan dilinearisasi menjadi satu kolom ( (:)), yang rerata dihitung ( mean(...)).


Anda dapat menyimpan 1 byte dengan yang lebih mudah dibaca [x;x;x;x]daripada~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))juga 2 byte lebih sedikit. Itu sebabnya saya muncul, tetapi pada dasarnya sama dengan pendekatan Anda.
Tom Carpenter

@ TomCarpenter Saya tidak berpikir itu sama. Saya pikir Anda harus mempostingnya sebagai jawaban terpisah
Luis Mendo

3

J , 20 18 byte

2 byte terima kasih kepada @miles

# -: @% ~ - @ # + / @}. #}. 4 #]
- @ # (+ /% #) @}. #}. 4 #]

Cobalah online! ( Penerjemah online )

Pemakaian

>> f =: -@#(+/%#)@}.#}.4#]
>> f 1 3 5 7 9 11 13 15 17
<< 9

Bagaimana itu bekerja

Ini adalah terjemahan dari jawaban saya dalam Pyth .



@ Adám Terima kasih, ditambahkan.
Leaky Nun

2
Anda bisa langsung mengambil rata-rata porsi tengah -@#(+/%#)@}.#}.4#]selama 18 byte .
miles


2

Oktaf, 42 byte

Fungsi anonim lain untuk Oktaf.

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))

Anda dapat mencobanya secara online . Cukup masukkan perintah itu, lalu lakukan ans([1 2 4 5 6 9])atau angka apa pun yang diperlukan.

Yang ini dimulai dengan membuat dari satu array input dengan 4 dari setiap elemen input dengan terlebih dahulu menggabungkan empat salinan secara vertikal, dan kemudian meratakannya secara vertikal. Ini mempertahankan urutan pengurutan.

Kemudian adalah mengekstrak rentang elemen dari panjang array input ditambah 1 hingga tiga kali panjang array input. Karena array baru empat kali lebih lama, ini memotong kuartil atas dan bawah.

Akhirnya rata-rata array baru dikembalikan.


2

05AB1E, 15 byte

€D€D¹gô¦¨˜DOsg/

Penjelasan

€D€D             # quadruple each element in list
    ¹gô          # split into pieces the size of input
       ¦¨˜       # remove the first and last and flatten the middle 2
          DOsg/  # sum and divide by length

Cobalah online


2

APL (Dyalog) , 15 byte

IQM←(+/÷≢)≢↓-∘≢↓4∘/

Cobalah online!

4∘/ melipatgandakan setiap elemen

-∘≢↓ jatuhkan elemen trailing sebanyak-banyaknya karena ada elemen dalam argumen

≢↓ turunkan banyak elemen utama karena ada elemen dalam argumen

(... ) terapkan fungsi diam-diam berikut:

+/ jumlah

÷ dibagi dengan

 penghitungan


1

JavaScript (ES6), 75 byte

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

Menggunakan pendekatan quadruplicate-and-sort yang jelas, dan saya bisa menggunakannya reduce, yang bagus. Satu-satunya tipuan di sini adalah untuk menyimpan 4 byte dengan menggunakan kembali komparator pengurutan untuk mengurangi semua elemen array dari nol, yang memberi saya -2lkali jawaban yang saya inginkan.



1

Sebenarnya, 12 byte

4α;l¼≈;±(Htæ

Cobalah online! (saat ini tidak berfungsi karena TIO adalah beberapa versi di belakang)

Penjelasan:

4α;l¼≈;±(Htæ
4α            repeat each element 4 times
  ;l¼≈        length divided by 4, as integer
      ;±      copy, unary negate
        (Ht   remove first and last quartiles
           æ  mean

1

Mathematica, 51 byte

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

Urutkan empat salinan daftar (untuk mencegah masalah dengan panjang daftar bukan kelipatan empat), ambil bagian "1 quarter the length of resulting list plus 1"melalui "1/4 length list + 1 from the end", ambil Mean.


1

Java 146 126 Bytes

Java banyak verbose!

float m(float[]n){float r=0;int l=n.length,i=l/4;r-=(n[i])*(l%4)/4;r+=n[i*3]*(4-(l%4))/4;for(;i<l*3/4;r+=n[i],i++);return r/l*2;}

Lebih tua Ungolfed sebagian dapat dibaca dengan kasus uji

/**
 *
 * @author rohan
 */
public Golf{

float m(float[]n){
//declarations 
float r=0;
int x,i=0,l=n.length;
//sum the array 
for(float m:n){r+=m;}
//remove the excess
for(;i<l/4;r-=n[i]+n[l-i-1],i++);
//weight the quartiles
r-=(n[l/4]+n[l*3/4])*(l%4)/4;
//return the sum/length but multiply by two since only half of the set is averaged
return r/l*2;
    }
static void interQuartileMean(float... set){
    System.out.println(new Golf().m(set));
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    //test cases pass with flying colours
        interQuartileMean(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38);
        interQuartileMean(1, 3, 5, 7, 9, 11, 13, 15, 17);   
    }

}

1

Clojure, 82 81 byte

Sunting: 1 byte lebih sedikit dengan menulis ulang bagian "didvide by 2 n".

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

Sebelumnya:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

Menggunakan foruntuk menghasilkan 4 nilai berulang, menggunakan float 2.0tidak memiliki hasil fraksional, sisanya hanya standar.


1

R, 17 11 byte

mean(n,0.25)

Dengan asumsi nadalah vektor input dalam bentuk R standarn=c(1, 2, 3, ...) .

Ini sama sekali tidak mengejutkan karena R dapat dianggap sebagai "bahasa untuk komputasi statistik" dan memiliki banyak statistik built-in.

MEMPERBARUI. Disimpan 6 byte berkat rturnbull karenatrim merupakan argumen opsional pertama secara default!

Kasus uji:

a <- c(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38)
b <- c(1, 3, 5, 7, 9, 11, 13, 15, 17)
mean(a,trim=0.25) # Returns 6.5
mean(b,trim=0.25) # Returns 9

Karena trimargumen kedua default, Anda tidak perlu menyebutkannya; 0.25dapat disingkat menjadi .25atau 1/4. Ini menghemat enam byte.
rturnbull

0

Excel, 17 byte

=TRIMMEAN(A:A,.5)

Format input yang santai membuat ini mudah. Masukkan satu per baris di Kolom A.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.