Fivenum und ein bisschen


14

(Ein Paradoxon, ein Paradoxon, ein genialstes Paradoxon)

Dies ist der erste Teil einer mehrteiligen Serie, die von verschiedenen R-Funktionen inspiriert ist.

Die Aufgabe

Ausgehend von einem Datensatz D mit positiven ganzen Zahlen müssen Sie die 5-stellige Zusammenfassung von D berechnen . Da ich jedoch an großen Datenmengen arbeite, muss Ihr Code so klein wie möglich sein, damit ich ihn auf meinem Computer speichern kann.

Die Fünf-Nummern-Zusammenfassung besteht aus:

  • Mindestwert
  • Erstes Quartil (Q1)
  • Median / Zweites Quartil (Q2)
  • Drittes Quartil (Q3)
  • Maximalwert

Es gibt verschiedene Möglichkeiten, die Quartile zu definieren, aber wir werden die von R implementierte verwenden:

Definitionen:

  • Minimum und Maximum: der kleinste bzw. der größte Wert.
  • Median: der mittlere Wert, wenn D eine ungerade Anzahl von Einträgen hat, und das arithmetische Mittel der beiden am weitesten in der Mitte liegenden Werte, wenn D eine gerade Anzahl von Einträgen hat. Beachten Sie, dass dies bedeutet, dass der Median ein nicht ganzzahliger Wert sein kann. Wir mussten vorher den Median berechnen .
  • Erstes und drittes Quartil: Teilen Sie die Daten in zwei Hälften, einschließlich des zentralen Elements in jeder Hälfte, wenn D eine ungerade Anzahl von Einträgen aufweist, und ermitteln Sie den Medianwert jeder Hälfte. Der Median der unteren Hälfte ist das erste Quartil und der Median der oberen Hälfte ist das dritte Quartil.

Beispiele:

D=[1,2,3,4,5] . Der Median ist dann3 , und die untere Hälfte ist[1,2,3] , was ein erstes Quartil von2 ergibt, und die obere Hälfte ist[3,4,5] , was ein drittes Quartil von4 ergibt.

D=[1,3,3,4,5,6,7,10] . Der Median ist4.5 , und die untere Hälfte ist[1,3,3,4] , was ein erstes Quartil von3 ergibt, und die obere Hälfte ist[5,6,7,10] , was ein drittes Quartil von6.5 ergibt.

Zusätzliche Regeln:

  • Die Eingabe erfolgt als Array oder als das nächste Äquivalent Ihrer Sprache.
  • Sie können davon ausgehen, dass das Array in aufsteigender oder absteigender Reihenfolge sortiert ist (geben Sie jedoch an, welche).
  • Sie können die Ergebnisse in jeder Rückkehr / drucken konsistente Reihenfolge und in je nachdem , was flexibles Format Sie wollen, aber bitte den Auftrag und das Format in Ihrer Antwort bezeichnen.
  • Eingebaute Funktionen, die äquivalent zu fivenumsind , sind zulässig, aber bitte implementieren Sie auch Ihre eigene Lösung.
  • Sie können nicht davon ausgehen, dass jede der fünf Zahlen eine Ganzzahl ist.
  • Erklärungen sind erwünscht.
  • Das ist , also gewinnt die kürzeste Antwort in jeder Sprache!

Nach dem Zufallsprinzip generierte Testfälle

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

Antworten:


6

R , 7 Bytes

fivenum

Probieren Sie es online!

Offensichtliche freche Antwort. ;-)

Interessanterweise fivenum(x)ist es nicht gleichwertig , summary(x)auch wenn xnumerisch ist, da die Quantile unterschiedlich berechnet werden: fivenumDurchschnittswert an Diskontinuitäten, wohingegen summaryinterpoliert. Sie können erzwingen summary, sich wie fivenummit der Option zu verhalten quantile.type, dies ist jedoch immer noch länger als

R , 51 Bytes

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

Probieren Sie es online!

t=2n3(mod4)

Beachten Sie, dass der Quellcode der fivenumintegrierten Software sehr unterschiedlich ist (und viel länger dauert).


Das einzige, was ich finden kann, ist, dass quantileein benannter Vektor zurückgegeben wird, während fivenumunbenannt ist. Vielleicht ist das ein Problem hinter dem, wo fivenumverwendet wird?
JAD

@JAD Das Einschließen des Codes in unname()würde das lösen. Vielleicht gibt es historische Gründe?
Robin Ryder

1
Ihre Funktion unterscheidet sich von fivenumfür Eingaben der Länge 3 mod 4, einschließlich zwei der Testfälle.
Nitrodon

@ Nitrodon Argh! Danke fürs bemerken! Es sollte jetzt OK sein.
Robin Ryder

5

MATL , 18 Bytes

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

Die Ausgabereihenfolge steigt wie in den Testfällen.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

MATL berechnet wie MATLAB bei Bedarf Quantile mit linearer Interpolation (genau wie in der Abfrage für den Median angegeben). Um das erforderliche Verhalten für das erste und dritte Quartil zu erzielen, genügt es, den Median zu wiederholen, wenn die Länge der Eingabe ungerade ist. Dann sind die Ergebnisse nur die Quantile 0, .25, .5, .75 und 1.

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



1

Python 3.8, 97 Bytes

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

Dies setzt voraus, dass die Eingabeliste in aufsteigender Reihenfolge sortiert ist. fist die Funktion, um die 5-Zahlen-Zusammenfassung zurückzugeben.

{michn,meinx,Q.1,Q.2,Q.3}

Ich habe ein paar Bytes entfernt, indem ich einige Hinweise aus FlipTacks Antwort auf Compute the Median genommen habe.

Probieren Sie es online!

Wie funktioniert es?

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)

Es ist in Ordnung, eine Funktion zu verwenden, die den Median berechnet. Diese Einreichung würde nicht mehr von Python (3?), sondern von "Python + Statistikpaket" oder ähnlichem erfolgen.
Giuseppe

1

Holzkohle , 33 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Die Ausgabe erfolgt in aufsteigender oder absteigender Reihenfolge, je nachdem, ob die Eingabe in aufsteigender oder absteigender Reihenfolge erfolgt. Erläuterung:

≔⊖Lθη

Liefert den Index des letzten Elements.

IE

Ordnen Sie die Elemente des folgenden Arrays zu und setzen Sie das Ergebnis in eine Zeichenfolge um, damit es implizit in separaten Zeilen gedruckt wird.

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

Berechnen Sie die Positionen der Quartilelemente, wobei ein Extra 0.5angibt, dass der Wert der Durchschnitt zweier benachbarter Elemente ist.

⊘⁺§θ⌊ι§θ⌈ι

Berechnen Sie das Quartil an jeder Position, indem Sie den Durchschnitt der Werte am Boden und an der Decke der Position berechnen.



1

C (gcc) , 123 121 119 Bytes

-2 dank ceilingcat.

Nimmt eine Liste an, die in aufsteigender Reihenfolge sortiert ist.

Ausgänge in Reihenfolge: min, Q1, Q2, Q3, max.

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

Probieren Sie es online!


1

05AB1E , 18 Bytes

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

Output Ordnung ist: [Q1, Q3, Q2, min, max].

Probieren Sie es online aus oder überprüfen Sie alle Testfälle . (Ich habe eine Sortierung {für die Testsuite hinzugefügt , damit die Testfälle in der Reihenfolge leichter überprüft werden können [min, Q1, Q2, Q3, max].)

Erläuterung:

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)
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.