Wyzwanie
Biorąc pod uwagę niepustą listę liczb rzeczywistych, oblicz jej medianę.
Definicje
Mediana jest obliczana w następujący sposób: Najpierw posortuj listę,
- jeśli liczba wpisów jest nieparzysta , mediana jest wartością na środku posortowanej listy,
- w przeciwnym razie mediana jest średnią arytmetyczną dwóch wartości znajdujących się najbliżej środka posortowanej listy.
Przykłady
[1,2,3,4,5,6,7,8,9] -> 5
[1,4,3,2] -> 2.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5
[1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,-5,100000,1.3,1.4] -> 1.5
code-golf
statistics
wada
źródło
źródło
7/2
Lub8/2
)Odpowiedzi:
Python 2 , 48 bajtów
Funkcja bez nazwy, która zwraca wynik. -1 bajt dzięki xnor.
Pierwszym krokiem jest oczywiście posortowanie tablicy za pomocą
l.sort()
. Możemy jednak mieć tylko jedną instrukcję w lambda, dlatego wykorzystujemy fakt, że funkcja sortowania zwraca wartośćNone
dodającor
- podobnie jakNone
falsy w Pythonie, co nakazuje jej ocenę i zwrócenie następnej części instrukcji.Teraz mamy posortowaną listę, musimy znaleźć środkową lub środkową dwie wartości.
Używanie warunkowego sprawdzania parzystości długości byłoby zbyt szczegółowe, więc zamiast tego otrzymujemy indeksy
len(l)/2
i~len(l)/2
:Jeśli lista ma nieparzystą długość, indeksy te wskażą tę samą wartość. Jeśli jest równej długości, będą wskazywać na środkowe dwa elementy.
Teraz, gdy mamy te dwa indeksy, znajdujemy te wartości na liście, sumujemy je i dzielimy przez 2. Końcowe miejsce po przecinku
/2.
zapewnia, że jest to dzielenie zmiennoprzecinkowe, a nie dzielenie całkowite.Wynik jest domyślnie zwracany, ponieważ jest to funkcja lambda.
Wypróbuj online!
źródło
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
, myśląc, że był o 1 bajt dłużej.Python3 -
3130 bajtówZapisano bajt dzięki @Dennis!
Nie planowałem wbudowanej odpowiedzi, ale znalazłem ten moduł i pomyślałem, że to naprawdę fajne, ponieważ nie miałem pojęcia, że istnieje.
Wypróbuj online tutaj .
źródło
from statistics import*;median
zapisuje bajt.__import__
, aleimport math;math.log
bijefrom math import*;log
.Właściwie 1 bajt
Wypróbuj online!
źródło
Galaretka , 9 bajtów
Wypróbuj online!
Wyjaśnienie
Wciąż mam problemy z galaretką ... Nie byłem w stanie znaleźć wbudowanych mediany ani środka listy, ale jest to bardzo wygodne dla tego wyzwania, że Jelly pozwala indeksom niecałkowitym na listy, w takim przypadku zwróci parę dwóch najbliższych wartości. Oznacza to, że możemy pracować z połową długości wejściowej jako indeksem i uzyskać parę wartości, gdy musimy ją uśrednić.
źródło
Æṁ
zadziała terazBrain-Flak , 914 + 1 = 915 bajtów
Wymaga
-A
flagi do uruchomienia.Wypróbuj online!
Wyjaśnienie
Podstawą tego algorytmu jest bąbelkowy rodzaj, który napisałem jakiś czas temu.
Nie pamiętam, jak to działa, więc nie pytaj mnie. Ale wiem, że sortuje stos, a nawet działa na negatywy
Po uporządkowaniu wszystkiego znajduję 2 razy medianę z następującą porcją
Teraz pozostało tylko przekonwertować na ASCII
źródło
R, 6 bajtów
Nic dziwnego, że R, statystyczny język programowania, ma to wbudowane.
źródło
R
pokonując Galaretkę: D: D: DMATL , 4 bajty
Znajduje to 0,5-kwantyl, który jest medianą.
Wypróbuj online!
źródło
i
, co zasugerowałeś, aby domniemać? :-PPyth - 11 bajtów
Znajduje średnią środkowego elementu wykonanego zarówno do tyłu, jak i do przodu.
Pakiet testowy .
źródło
Oktawa , 38 bajtów
Definiuje to anonimową funkcję. Dane wejściowe to wektor wiersza.
Wypróbuj online!
Wyjaśnienie
źródło
bsxfun
” imean
:-)JavaScript,
5752 bajtówPosortuj tablicę numerycznie. Jeśli tablica ma równą długość, znajdź 2 środkowe liczby i uśrednij je. Jeśli tablica jest nieparzysta, znajdź środkową liczbę dwa razy i podziel przez 2.
źródło
Array.sort()
sort()
bezpośrednio i usuwająct
zmienną:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
to się nie powiedzie.>>
jest znakiem przesunięcia w prawo propagującym znaki , co oznacza, że gdy liczba jest interpretowana jako 32-bitowa liczba całkowita, jeśli msb jest ustawione, pozostaje ustawione, co powoduje, że wynik jest ujemny2**32>x>=2**31
. Pox>=2**32
prostu się poddaje0
.Matlab / Octave, 6 bajtów
Nudne wbudowane:
Wypróbuj online!
źródło
@median
?Mathematica, 6 bajtów
Jak tylko odkryję Mthmtca , zamieszczam w nim rozwiązanie.
źródło
CBC8
(ËÈ
). Jednak dopóki nie zastosuję kolejnej poprawki, pojęcie wywoływania funkcji może nie spełniać standardów PPCG.Perl 6 , 31 bajtów
Spróbuj
Rozszerzony:
źródło
APL (Dyalog Unicode) , 14 bajtów
Wypróbuj online!
To jest pociąg. Pierwotny dfn był
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.Pociąg ma następującą strukturę
⊢
oznacza właściwy argument.⌷
indeks⊂∘⍋
indeksy indeksowane do⊢
wyników⊢
są sortowane÷∘2
w⊢
podzielonej przez 22/
powtórz to dwa razy, tak1 5 7 8
się stanie1 1 5 5 7 7 8 8
2+/
weź sumę par, staje się(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
z tego wyboru≢
element o indeksie równym długości⊢
Poprzednie rozwiązania
źródło
Common Lisp, 89
Obliczam średnią z elementów na pozycji,
(floor middle)
a(ceiling middle)
gdziemiddle
jest liczony od zera indeks środkowego elementu posortowanej listy. Możliwe jest,middle
aby być liczbą całkowitą, na przykład1
dla listy danych wejściowych o rozmiarze 3, na przykład(10 20 30)
, lub ułamkiem dla list z parzystą liczbą elementów, na przykład3/2
dla(10 20 30 40)
. W obu przypadkach obliczamy oczekiwaną wartość mediany.źródło
Vim, 62 bajty
Zrobiłem to początkowo w V, używając do końca tylko manipulacji tekstem, ale byłem sfrustrowany obsługą [X] i [X, Y], więc oto prosta wersja. Są mniej więcej tej samej długości.
Wypróbuj online!
Materiały niedrukowalne:
Wyróżnienie:
^O
wyjdzie z trybu wstawiania dla jednego polecenia (polecenie let).^R"
wstawia szarpany tekst (w tym przypadku listę)źródło
TI-Basic, 2 bajty
Bardzo proste.
źródło
Ans
nie jest dozwoloną metodą we / wy .C #, 126 bajtów
Całkiem proste, tutaj z LINQ, aby uporządkować wartości, pominąć połowę listy, wziąć jedną lub dwie wartości w zależności od parzystości / nieparzystości i uśrednić je.
źródło
using System.Linq;
w swojej liczbie bajtów, jednak możesz to anulować, wprowadzając pewne zmiany. Skompiluj do aFunc<float[], float>
i przypisz wartość modulo do zmiennej na 106 bajtów:using System.Linq;a=>{int x=a.Length,m=x%2<1?1:0;return a.OrderBy(g=>g).Skip(x/2-m).Take(++m).Average();};
C ++ 112 bajtów
Dzięki @ original.legin za pomoc w oszczędzaniu bajtów.
Stosowanie:
źródło
float
zamiastdouble
zapisać dwa bajty. Ponadto w GCC możesz używać#import<vector>
i#import<algorithm>
zamiast#include
. (Należy pamiętać, że nie trzeba przestrzeń po albo#include
albo#import
)J ,
1614 bajtówWypróbuj online!
Oprócz sztuczki BMO polegającej na powielaniu tablic odkryłem, że możemy dodać całą tablicę posortowaną w dwóch kierunkach. Potem zdałem sobie sprawę, że dwa kroki można odwrócić, tj. Dodać dwie tablice, a następnie powielić je i wziąć ten
n
element.Jak to działa
Poprzednie odpowiedzi
J z
stats
dodatkiem, 18 bajtówWypróbuj online!
Funkcja biblioteki FTW.
median
Implementacja wygląda następująco:J , 31 bajtów
Wypróbuj online!
Jak to działa
Trochę gry w golfa daje:
J , 28 bajtów
Wypróbuj online!
źródło
#{0,2+/\2#-:/:]
blisko 15 bajtów (człowiek, za którym tęsknię⎕io
).J, 19 bajtów
Wyjaśnienie:
źródło
~
bezpośrednio do siebie<.@-:@#{/:~-:@+\:~
JavaScript, 273 bajtów
źródło
Java 7, 99 bajtów
Gra w golfa:
Nie golfowany:
Wypróbuj online
źródło
java.util.Arrays
?Pari / GP - 37
39bajtówNiech być rowvector zawierające wartości.
Ponieważ Pari / GP jest interaktywny, nie jest potrzebne dodatkowe polecenie do wyświetlenia wyniku.
W przypadku linku „try-it-online” dodawana jest linia przed i po. Aby wydrukować, wynik mediany jest przechowywany w zmiennej w
Wypróbuj online!
źródło
Japt, 20 bajtów
Przetestuj online! Japt naprawdę nie ma żadnych wbudowanych potrzebnych do stworzenia naprawdę krótkiej odpowiedzi na to wyzwanie ...
Wyjaśnienie
źródło
Java 8, 71 bajtów
Parzystość jest fajna! Oto lambda od
double[]
doDouble
.Nie dzieje się tu nic skomplikowanego. Tablica jest sortowana, a następnie biorę średnią z dwóch liczb z tablicy. Istnieją dwa przypadki:
s
is-1
oba dzielą się na indeks środkowego elementu. Liczba jest dodawana do siebie, a wynik dzielony przez dwa, dając pierwotną wartość.Wypróbuj online
źródło
SmileBASIC, 45 bajtów
Pobiera średnią z elementów na podłodze (długość / 2) i podłodze (długość / 2-0,5) Bardzo proste, ale udało mi się zaoszczędzić 1 bajt, przenosząc rzeczy:
źródło
Łuska , 10 bajtów
Wypróbuj online!
Wyjaśnienie
Niestety
½
dla list ma typ,[a] -> [[a]]
a[a] -> ([a],[a])
który nie pozwala,F~+→←
ponieważfoldl1
potrzebuje funkcji typua -> a -> a
jako pierwszego argumentu, zmuszając mnie do użyciae
.źródło
R bez użycia
median
wbudowanego 51 bajtówWypróbuj online!
źródło
function(x)mean(x,.5)
GolfScript ,
27252017 bajtówPobiera dane wejściowe jako tablicę liczb całkowitych na stdin. Wyjścia jako ułamek nieredukowany. Wypróbuj online!
Wyjaśnienie
Wynik będzie podobny
10/2
.źródło