Interquartil-Mittelwert


26

Aufgabe

Geben Sie (mit allen Mitteln) einen sortierten Gleitkomma-Datensatz an und geben Sie (mit allen Mitteln und innerhalb von 1 ‰ des korrekten Werts) den Interquartil-Mittelwert zurück .

Ein möglicher Algorithmus

  1. Verwerfen Sie das niedrigste und das höchste Viertel der Datenpunkte.
  2. Berechnen Sie den Durchschnitt (Summe geteilt durch Anzahl) der verbleibenden Datenpunkte.

Hinweis: Wenn die Datenmenge nicht gleichmäßig in vier Teile aufgeteilt werden kann, müssen Sie die Datenpunkte wiegen , die von den Teilmengen gemeinsam genutzt werden. Siehe Beispielbewertung 2 unten.

Beispielauswertung 1

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

  1. Die Datenanzahl beträgt 12, daher entfernen wir die niedrigsten und höchsten 3 Datenpunkte:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Durchschnitt der verbleibenden 6 Datenpunkte:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6,5

Beispielauswertung 2

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

  1. Die Anzahl ist 9, daher hat jedes Quartal 2¼ Datenpunkte:
    { 1, 2, (0,25 × 5), (0,75 × 5), 7, 9, 11, (0,75 × 13), (0,25 × 13), 15, 17 }.
  2. Durchschnitt der verbleibenden 4,5 Datenpunkte:
    (0,75 × 5 + 7 + 9 + 11 + 0,75 × 13) / 4,5 = 9

Antworten:



8

Pyth , 11 10 Bytes

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

Testsuite.

Wie es funktioniert

Die Eingabeliste wird vervierfacht, um sicherzustellen, dass die Anzahl der Daten durch 4 teilbar ist.

Es muss noch sortiert werden, da dies nicht *4für jedes einzelne Element, sondern für die gesamte Liste gilt.

Dann wird die Liste in vier gleiche Teile geteilt und der erste und der letzte Teil entfernt.

Die verbleibende Liste wird abgeflacht und der Durchschnitt gebildet.


8

MATL , 12 11 Bytes

4Y"G"6L)]Ym

Die Eingabe ist ein horizontaler Vektor mit dem Format

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

oder

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

Probieren Sie es online!

Erläuterung

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

Ich verstehe es nicht. Wie werden 6L)das erste und das letzte Element entfernt? Wenn ich es tue, werden eine Reihe komplexer Zahlen verschoben.
DJMcMayhem

5
@DrGreenEggsandIronMan In MATL können dafür komplexe Zahlen verwendet werden. Die imaginäre Einheit steht für das Ende des Arrays, und wenn zwei von drei Zahlen vorhanden sind, definieren sie einen Bereich. Also, [2, -1+i]wenn als Index verwendet bedeutet2:end-1
Luis Mendo

7

Schneemann , 66 Bytes

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

Probieren Sie es online!

Verwendet den gleichen Algorithmus wie die Antworten von @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
Diese Sprache sieht schrecklich aus. Ich liebe es.
Mego


5

Jelly , 14 13 12 Bytes

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

Probieren Sie es online!

Testsuite.

Wie es funktioniert

Es ist eine Übersetzung meiner Antwort in Pyth .


Ich bin mir ziemlich sicher, dass dies gekürzt werden kann, da ich es in APL 15 tun kann.
Adám

@ Adám Bitte poste deine Lösung (damit ich haha ​​kopieren kann)
Undichte Nonne

Ich möchte Marinus eine Chance geben ...
Adám


Genug der Chance nach mehr als 9 Monaten
Luis Mendo


4

Brachylog , 21 Bytes

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

Probieren Sie es online! oder überprüfen Sie mehrere Testfälle

Erläuterung

Dies ist im Grunde @ LeakyNuns Pyth-Antwortalgorithmus.

: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

Der einzige kleine Trick besteht darin, mit der Umkehrung der Länge zu multiplizieren, anstatt durch die Länge zu dividieren, da die Division zwischen zwei Ganzzahlen eine Ganzzahldivision ist.


3

Oktave , 44 Bytes

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

Dies definiert eine anonyme Funktion.

Die Eingabe ist ein horizontaler Vektor.

Probiere es auf ideone aus .

Erläuterung

Der eingegebene horizontale Vektor wird zuerst *mit einem Spaltenvektor von vier Einsen (gebaut mit ~~(1:4)') matrixmultipliziert ( ). Das Ergebnis ist eine vierspaltige Matrix, bei der jede Zeile eine Kopie des Eingabevektors ist. Diese wird dann unter Beibehaltung der linearen Reihenfolge der Elemente in eine 4-Spalten-Matrix ( reshape(...,[],4)) umgeformt . Die beiden mittleren Spalten werden beibehalten ( (:,2:3)) und in eine einzige Spalte linearisiert ( (:)), aus der der Mittelwert berechnet wird ( mean(...)).


Sie können 1 Byte mit der besser lesbaren [x;x;x;x]anstelle von speichern~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))ist auch 2 Bytes weniger. Das war der Grund, warum ich es mir ausgedacht hatte, aber es ist im Grunde das gleiche wie bei Ihnen.
Tom Carpenter

@ TomCarpenter Ich denke nicht, dass es so ähnlich ist. Ich denke, Sie sollten es als separate Antwort posten
Luis Mendo

3

J , 20 bis 18 Bytes

2 Bytes dank @miles

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

Probieren Sie es online! ( Online-Dolmetscher )

Verwendung

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

Wie es funktioniert

Es ist eine Übersetzung meiner Antwort in Pyth .



@Adam Danke, fügte hinzu.
Undichte Nonne

2
Sie können einfach direkt den Durchschnitt des mittleren Teils -@#(+/%#)@}.#}.4#]für 18 Bytes berechnen .
Meilen


2

Oktave, 42 Bytes

Eine weitere anonyme Funktion für Octave.

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

Sie können es online ausprobieren . Geben Sie einfach diesen Befehl ein und machen Sie es dannans([1 2 4 5 6 9]) oder welche Zahlen auch immer erforderlich sind.

Dies beginnt damit, dass aus dem Eingabearray eines mit 4 von jedem Eingabeelement erstellt wird, indem zuerst vier Kopien vertikal verkettet und dann vertikal abgeflacht werden. Dadurch bleibt die Sortierreihenfolge erhalten.

Dann wird der Bereich der Elemente aus der Länge des Eingabearrays plus 1 bis zum Dreifachen der Länge des Eingabearrays extrahiert. Da das neue Array viermal länger ist, werden das obere und das untere Quartil abgeschnitten.

Schließlich wird der Mittelwert des neuen Arrays zurückgegeben.


2

05AB1E, 15 Bytes

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

Erläuterung

€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

Probieren Sie es online aus


2

APL (Dyalog) , 15 Bytes

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

Probieren Sie es online!

4∘/ jedes Element vervierfachen

-∘≢↓ Löschen Sie so viele nachfolgende Elemente, wie Elemente in den Argumenten enthalten sind

≢↓ Löschen Sie so viele führende Elemente, wie Elemente im Argument enthalten sind

() Wenden folgende stillschweigende Funktion an:

+/ die Summe

÷ geteilt durch

 die Bilanz


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

Verwendet den offensichtlichen Vierfach-Sortier-Ansatz, und ich kann ihn verwenden reduce, was nett ist. Der einzige Trick dabei ist, 4 Bytes einzusparen, indem der Sortierkomparator erneut verwendet wird, um alle Array-Elemente von Null zu subtrahieren. Dadurch erhalte ich -2lmal die gewünschte Antwort.



1

Eigentlich 12 Bytes

4α;l¼≈;±(Htæ

Probieren Sie es online!(Funktioniert derzeit nicht, da TIO einige Versionen hinter sich hat)

Erläuterung:

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 Bytes

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

Sortiert vier Exemplare der Liste (um Probleme mit der Listenlänge zu vermeiden, nicht ein Vielfaches von vier), nimmt "1 quarter the length of resulting list plus 1"an den teil "1/4 length list + 1 from the end", nimmt ihre Mean.


1

Java 146 126 Bytes

Solcher Java viel wortreich!

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

Älterer Ungolfed teilweise lesbar mit Testfällen

/**
 *
 * @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 Bytes

Edit: 1 Byte weniger durch Umschreiben des Teils "didvide by 2 n".

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

Bisherige:

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

Verwendet for, um 4 wiederholte Werte zu generieren, wobei float 2.0keine gebrochenen Ergebnisse liefert, der Rest ist nur Standard.


1

R 17 11 Bytes

mean(n,0.25)

Es nwird angenommen, dass der Eingabevektor in der Standard-R-Form vorliegtn=c(1, 2, 3, ...) .

Dies ist keineswegs überraschend, da R als "DIE Sprache für statistische Berechnungen" angesehen werden kann und viele statistische Funktionen enthält.

AKTUALISIEREN. 6 Bytes gespart dank rturnbull weiltrim standardmäßig das erste optionale Argument ist!

Testfälle:

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

Da dies trimdas zweite Standardargument ist, müssen Sie es nicht benennen. 0.25kann auf .25oder gekürzt werden 1/4. Das spart Ihnen sechs Bytes.
Rturnbull

0

Excel, 17 Bytes

=TRIMMEAN(A:A,.5)

Entspanntes Eingabeformat machen dies einfach. Geben Sie eine pro Zeile in Spalte A ein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.