Średnia międzykwartylowa

26

Zadanie

Biorąc pod uwagę (w jakikolwiek sposób) posortowany zmiennoprzecinkowy zestaw danych, zwróć (w dowolny sposób iw granicach 1 ‰ prawidłowej wartości) średnią międzykwartylową .

Jeden możliwy algorytm

  1. Odrzuć najniższą i najwyższą czwartą punktów danych.
  2. Oblicz średnią (sumę podzieloną przez liczbę) pozostałych punktów danych.

Uwaga: Jeśli rozmiar zestawu danych nie jest równomiernie podzielony na cztery, należy zważyć punkty danych, które są wspólne dla podzestawów. Zobacz przykładową ocenę 2 poniżej.

Przykładowa ocena 1

Biorąc pod uwagę {1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38}

  1. Liczba danych wynosi 12, więc usuwamy najniższe i najwyższe 3 punkty danych:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Średnia z pozostałych 6 punktów danych:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6,5

Przykładowa ocena 2

Biorąc pod uwagę {1, 3, 5, 7, 9, 11, 13, 15, 17}

  1. Liczba wynosi 9, więc każdy kwartał ma 2 1/4 punktów danych:
    { 1, 2, (0,25 × 5), (0,75 × 5), 7, 9, 11, (0,75 × 13), (0,25 × 13), 15, 17 }
  2. Średnia z pozostałych 4,5 punktów danych:
    (0,75 × 5 + 7 + 9 + 11 + 0,75 × 13) / 4,5 = 9
Adám
źródło

Odpowiedzi:

5

Scilab, 8 bajtów

trimmean

Zobacz dokumentację . Domyślnie discard=50IQM jest obliczany.

EDYCJA: Wiesz, to jest trywialna wbudowana odpowiedź, więc zaznaczam ją jako CW .

Lynn
źródło
Myślę, że to będzie zwycięzca. Dobra robota.
Adám,
8

Pyth , 11 10 bajtów

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

Zestaw testowy.

Jak to działa

Czterokrotność listy danych wejściowych zapewnia, że ​​liczba danych jest podzielna przez 4.

Nadal wymaga sortowania, ponieważ *4dotyczy całej listy zamiast każdego elementu.

Następnie dzieli listę na cztery równe części, a następnie usuwa pierwszą i ostatnią część.

Pozostała lista jest spłaszczona i pobierana jest średnia.

Leaky Nun
źródło
8

MATL , 12 11 bajtów

4Y"G"6L)]Ym

Wejście jest wektorem poziomym o formacie

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

lub

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

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
Nie rozumiem Jak 6L)usuwa pierwszy i ostatni element? Kiedy to robię, wypycha kilka liczb zespolonych.
DJMcMayhem
5
@DrGreenEggsandIronMan Liczby zespolone mogą być do tego użyte w MATL. Wyimaginowana jednostka oznacza koniec tablicy, a jeśli są dwie z trzech liczb, określają zakres. [2, -1+i]Kiedy więc użyty jako indeks oznacza2:end-1
Luis Mendo,
7

Bałwan , 66 bajtów

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

Wypróbuj online!

Używa tego samego algorytmu, co odpowiedzi @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
Klamka
źródło
2
Ten język wygląda okropnie. Kocham to.
Mego,
5

Galaretka , 14 13 12 bajtów

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

Wypróbuj online!

Zestaw testowy.

Jak to działa

To jest tłumaczenie mojej odpowiedzi w Pyth .

Leaky Nun
źródło
Jestem pewien, że można to skrócić, ponieważ mogę to zrobić 15 w APL.
Adám
@ Adám Proszę zamieścić swoje rozwiązanie (abym mógł skopiować haha)
Leaky Nun
Chcę dać Marinusowi szansę ...
Adám
Z pewnością dość szansy po ponad 9 miesiącach, z pewnością
Luis Mendo
4

Pyke, 16 13 bajtów

4*S4ftOsDsRl/

Wypróbuj tutaj!

niebieski
źródło
Złamałeś moją passę ...
Leaky Nun
Tak mi przykro :(
Niebieski
4

Brachylog , 21 bajtów

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

Wypróbuj online! lub zweryfikuj wiele przypadków testowych

Wyjaśnienie

Jest to w zasadzie algorytm odpowiedzi 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

Jedyną małą sztuczką jest pomnożenie przez odwrotność długości zamiast dzielenia przez długość, ponieważ podział między 2 liczbami całkowitymi jest dzieleniem liczb całkowitych.

Fatalizować
źródło
3

Oktawa , 44 bajty

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

Definiuje to anonimową funkcję.

Dane wejściowe to wektor poziomy.

Wypróbuj na ideone .

Wyjaśnienie

Wejściowy wektor poziomy jest najpierw mnożony *przez macierz ( ) przez wektor kolumny czterech (zbudowany z ~~(1:4)'). Wynikiem jest macierz czterokolumnowa, w której każdy wiersz jest kopią wektora wejściowego. Jest to następnie przekształcane, przy zachowaniu liniowego porządku elementów, w 4-kolumnową macierz ( reshape(...,[],4)). Dwie środkowe kolumny są przechowywane ( (:,2:3)) i zlinearyzowane do pojedynczej kolumny ( (:)), z której obliczana jest średnia ( mean(...)).

Luis Mendo
źródło
Możesz zapisać 1 bajt z bardziej czytelnym [x;x;x;x]zamiast~~(1:4)'*x
Tom Carpenter
@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))jest również 2 bajty mniej. Właśnie dlatego wymyśliłem, ale to w zasadzie to samo co twoje podejście.
Tom Carpenter
@TomCarpenter Nie sądzę, że jest tak podobny. Myślę, że powinieneś zamieścić to jako osobną odpowiedź
Luis Mendo
3

J , 20 18 bajtów

2 bajty dzięki @miles

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

Wypróbuj online! ( Tłumacz online )

Stosowanie

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

Jak to działa

To jest tłumaczenie mojej odpowiedzi w Pyth .

Leaky Nun
źródło
@ Adám Dzięki, dodano.
Leaky Nun
2
Możesz bezpośrednio wziąć średnią środkową część -@#(+/%#)@}.#}.4#]dla 18 bajtów .
mile
2

Faktycznie , 20 15 13 bajtów

; l╗; +; + S╜ @ t╜τ @ HΣ╜τ @ / 
; l; τ; a; +; + StHΣ /
; l; τ; aττStHΣ /

Wypróbuj online!

Jak to działa

To jest tłumaczenie mojej odpowiedzi w Pyth .

Leaky Nun
źródło
Tym razem odpowiedź jest czytelna (po grecku).
Adám
@ Adám Pyth używa ASCII.
Leaky Nun
2

Oktawa, 42 bajty

Kolejna anonimowa funkcja dla Octave.

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

Możesz spróbować online . Po prostu wprowadź to polecenie, a następnie wykonaj ans([1 2 4 5 6 9])dowolne wymagane liczby.

Ten zaczyna się od utworzenia z tablicy wejściowej po jednym z 4 każdego elementu wejściowego, najpierw łącząc cztery kopie w pionie, a następnie spłaszczając go w pionie. Utrzymuje to porządek sortowania.

Następnie wyodrębnia zakres elementów z długości tablicy wejściowej plus 1 do trzykrotności długości tablicy wejściowej. Ponieważ nowa tablica jest cztery razy dłuższa, tnie górny i dolny kwartyl.

Na koniec zwracana jest średnia z nowej tablicy.

Tom Carpenter
źródło
2

05AB1E, 15 bajtów

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

Wyjaśnienie

€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

Wypróbuj online

Emigna
źródło
2

APL (Dyalog) , 15 bajtów

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

Wypróbuj online!

4∘/ czterokrotnie każdy element

-∘≢↓ upuść tyle końcowych elementów, ile jest elementów w argumentach

≢↓ upuść tyle elementów wiodących, ile jest elementów w argumencie

() Zastosuj następującą funkcję ukrytą:

+/ Suma

÷ podzielony przez

 podsumowanie

Adám
źródło
1

JavaScript (ES6), 75 bajtów

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

Korzysta z oczywistego poczwórnego sortowania i sortowania, i mogę zacząć używać reduce, co jest miłe. Jedyną sztuczką jest tutaj zapisanie 4 bajtów przez ponowne użycie komparatora sortowania, aby odjąć wszystkie elementy tablicy od zera, co daje mi -2lrazy odpowiedź, której chcę.

Neil
źródło
1

Golfscript, 28 29 bajtów

~ .4 * $ \,. @ / 1> 2 <{+} * {+} * '/' @ 2 *
~ .4 * $ \,. @ / 1> 2 <{+} * {+} * \ 2 * -1? *

Wypróbuj online!

Leaky Nun
źródło
1

Właściwie 12 bajtów

4α;l¼≈;±(Htæ

Wypróbuj online! (obecnie nie działa, ponieważ TIO ma kilka wersji za sobą)

Wyjaśnienie:

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
Mego
źródło
1

Mathematica, 51 bajtów

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

Sortuje cztery kopie listy (aby zapobiec problemom z długością listy, a nie wielokrotnościami czterech), bierze udział "1 quarter the length of resulting list plus 1"w "1/4 length list + 1 from the end", pobiera je Mean.

LLAMAMYP
źródło
1

Java 146 126 bajtów

Taki java dużo gadatliwy!

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;}

Starsze Ungolfed częściowo czytelne z przypadkami testowymi

/**
 *
 * @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);   
    }

}
Rohan Jhunjhunwala
źródło
1

Clojure, 82 81 bajtów

Edycja: 1 bajt mniej przez ponowne napisanie części „didvide by 2 n”.

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

Poprzedni:

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

Używa fordo generowania 4 powtarzanych wartości, używając liczby zmiennoprzecinkowej, 2.0aby nie dać ułamkowych wyników, reszta jest tylko standardem.

NikoNyrh
źródło
1

R 17 17 bajtów

mean(n,0.25)

Zakładając, że njest wektor wejściowy w standardowej postaci R n=c(1, 2, 3, ...).

Nie jest to niczym zaskakującym, ponieważ R można uznać za „język obliczeń statystycznych” i ma wiele wbudowanych funkcji statystycznych.

AKTUALIZACJA. Zapisano 6 bajtów dzięki rturnbull, ponieważ domyślnie trimjest to pierwszy opcjonalny argument!

Przypadki testowe:

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
Andreï Kostyrka
źródło
Ponieważ trimjest to domyślny drugi argument, nie musisz go nazywać; 0.25można skrócić do .25lub 1/4. Oszczędza to sześć bajtów.
rturnbull
0

Excel, 17 bajtów

=TRIMMEAN(A:A,.5)

Zrelaksowany format wprowadzania ułatwia to. Wprowadź po jednym w wierszu w kolumnie A.

Wernisch
źródło