Fivenum i trochę

14

(paradoks, paradoks, najbardziej genialny paradoks)

To pierwsza część wieloczęściowej serii inspirowanej różnymi funkcjami R.

Zadanie

Biorąc pod uwagę zestaw danych dodatnich liczb całkowitych, musisz obliczyć podsumowanie 5 liczb z . Pracuję jednak nad dużymi zestawami danych, więc chcę, aby Twój kod był tak mały, jak to możliwe, co pozwala mi przechowywać go na moim komputerze.DD

Pięć liczbowe podsumowanie składa się z:

  • Minimalna wartość
  • Pierwszy kwartyl (Q1)
  • Mediana / Drugi kwartyl (Q2)
  • Trzeci kwartyl (Q3)
  • Maksymalna wartość

Istnieje kilka różnych sposobów definiowania kwartyli, ale użyjemy tego zaimplementowanego przez R:

Definicje:

  • Minimum i maksimum: odpowiednio najmniejsza i największa wartość.
  • Mediana: środkowa wartość, jeśli ma nieparzystą liczbę wpisów, i średnia arytmetyczna z dwóch środkowych wartości, jeśli ma parzystą liczbę wpisów. Zauważ, że oznacza to, że mediana może być wartością niecałkowitą. Wcześniej musieliśmy obliczyć medianę .Dre
  • Pierwszy i trzeci kwartyl: Podziel dane na dwie połowy, w tym środkowy element w każdej połowie, jeśli ma nieparzystą liczbę wpisów, i znajdź medianę każdej połowy. Mediana dolnej połowy to pierwszy kwartyl, a mediana górnej połowy to trzeci kwartyl.re

Przykłady:

re=[1,2),3),4,5] . Mediana wynosi wtedy , a dolna połowa to , co daje pierwszy kwartyl o wartości , a górna połowa to , co daje trzeci kwartyl o wartości .3)[1,2),3)]2)[3),4,5]4

re=[1,3),3),4,5,6,7,10] . Mediana wynosi , a dolna połowa wynosi , dając pierwszy kwartyl , a górna połowa wynosi [ 5 , 6 , 7 , 10 ] , dając trzeci kwartyl 6,5 .4.5[1,3),3),4]3)[5,6,7,10]6.5

Dodatkowe zasady:

  • Dane wejściowe są w postaci tablicy lub najbliższego odpowiednika Twojego języka.
  • Możesz założyć, że tablica jest posortowana w porządku rosnącym lub malejącym (ale określ, które).
  • Możesz zwrócić / wydrukować wyniki w dowolnej spójnej kolejności oraz w dowolnym elastycznym formacie, który ci się podoba, ale proszę podać kolejność i format w odpowiedzi.
  • Wbudowane funkcje równoważne fivenumsą dozwolone, ale proszę również zaimplementować własne rozwiązanie.
  • Być może nie zakładamy każdego z pięciu liczb będzie liczbą całkowitą.
  • Wyjaśnienia są zachęcane.
  • To jest , więc wygrywa najkrótsza odpowiedź w każdym języku!

Losowo generowane przypadki testowe

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

Odpowiedzi:

6

R , 7 bajtów

fivenum

Wypróbuj online!

Oczywista bezczelna odpowiedź. ;-)

Co ciekawe, fivenum(x)nie jest równoważne summary(x)nawet wtedy, gdy xjest liczbowe, ponieważ kwantyle są obliczane inaczej: fivenumśrednie przy nieciągłościach, podczas gdy summaryinterpolacje. Możesz zmusić się summarydo zachowania tak, jak w fivenumprzypadku tej opcji quantile.type, ale wciąż jest to dłuższe niż

R , 51 bajtów

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

Wypróbuj online!

t=2n3)(mod4)

Zauważ, że kod źródłowy fivenumwbudowanego jest bardzo różny (i znacznie dłuższy).

Robin Ryder
źródło
Jedyne, co mogę znaleźć, to to, że quantilezwraca nazwany wektor, podczas gdy nie fivenumma nazwy. Może to problem poniżej tego, gdzie fivenumjest używany?
JAD
@JAD Dołączenie kodu unname()rozwiązałoby to. Może istnieją powody historyczne?
Robin Ryder,
1
Twoja funkcja różni się od fivenumdanych wejściowych o długości 3 mod 4, w tym dwóch przypadków testowych.
Nitrodon,
@Nitrodon Argh! Dzięki za zauważenie! Teraz powinno być OK.
Robin Ryder
5

MATL , 18 bajtów

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

Kolejność produkcji rośnie, podobnie jak w przypadkach testowych.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

MATL, podobnie jak MATLAB, oblicza kwantyle przy użyciu interpolacji liniowej, jeśli to konieczne (tak jak określono w wyzwaniu dla mediany). Aby osiągnąć wymagane zachowanie dla pierwszego i trzeciego kwartylu, wystarczy powtórzyć medianę, jeśli długość danych wejściowych jest nieparzysta. Zatem wyniki to tylko kwantyle 0, .25, .5, .75 i 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
Luis Mendo
źródło
1

Python 3.8, 97 bajtów

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

Zakłada się, że lista wejściowa jest sortowana w porządku rosnącym. fjest funkcją zwracającą 5-cyfrowe podsumowanie.

{mjan,mzax,Q1,Q2),Q3)}

Zdjąłem kilka bajtów, czerpiąc wskazówki z odpowiedzi FlipTacka na Compute the Median.

Wypróbuj online!

Jak to działa?

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
źródło
dobrze jest użyć funkcji, która oblicza medianę; takie przesłanie nie byłoby już wykonywane przez Python (3?), ale „pakiet statystyk Python +” lub podobny.
Giuseppe,
1

Węgiel drzewny , 33 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjścia w kolejności rosnącej lub malejącej w zależności od tego, czy dane wejściowe są w kolejności rosnącej czy malejącej. Wyjaśnienie:

≔⊖Lθη

Pobierz indeks ostatniego elementu.

IE

Zamapuj elementy poniższej tablicy i rzutuj wynik na ciąg znaków w celu niejawnego drukowania w osobnych wierszach.

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

Oblicz pozycje elementów kwartylowych, gdzie dodatkowa 0.5oznacza, że ​​wartość jest średnią dwóch sąsiednich elementów.

⊘⁺§θ⌊ι§θ⌈ι

Oblicz kwartyl dla każdej pozycji, biorąc średnią wartości na podłodze i suficie pozycji.

Neil
źródło
1

C (gcc) , 123 121 119 bajtów

-2 dzięki pułapce cat.

Zakłada listę posortowaną w porządku rosnącym.

Wyjścia w kolejności: 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]);}

Wypróbuj online!

gastropner
źródło
1

05AB1E , 18 bajtów

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

Wyjście zamówienie jest: [Q1, Q3, Q2, min, max].

Wypróbuj online lub sprawdź wszystkie przypadki testowe . (Dodałem sortowanie {dla zestawu testów, więc przypadki testowe są łatwiejsze do zweryfikowania w kolejności [min, Q1, Q2, Q3, max]).

Wyjaśnienie:

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