Desafio
Dada uma lista não vazia de números reais, calcule sua mediana.
Definições
A mediana é calculada da seguinte forma: primeiro classifique a lista,
- se o número de entradas for ímpar , a mediana é o valor no centro da lista classificada,
- caso contrário, a mediana é a média aritmética dos dois valores mais próximos do centro da lista classificada.
Exemplos
[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
flawr
fonte
fonte
7/2
ou8/2
) #Respostas:
Python 2 , 48 bytes
Uma função sem nome que retorna o resultado. -1 byte graças ao xnor.
O primeiro passo é obviamente classificar a matriz usando
l.sort()
. No entanto, só podemos ter uma instrução em um lambda, portanto, utilizamos o fato de que a função de classificação retornaNone
adicionando umor
- comoNone
é falso no Python, isso indica para avaliar e retornar a próxima parte da instrução.Agora que temos a lista classificada, precisamos encontrar os valores intermediários ou intermediários.
Usar um condicional para verificar a paridade do comprimento seria muito detalhado; portanto, obtemos os índices
len(l)/2
e~len(l)/2
:Se a lista tiver um comprimento ímpar, esses índices apontarão para o mesmo valor. Se for de comprimento uniforme, eles apontarão para os dois itens centrais.
Agora que temos esses dois índices, encontramos esses valores na lista, somamos e dividimos por 2. A casa decimal à direita em
/2.
garante que seja a divisão flutuante em vez da divisão inteira.O resultado é retornado implicitamente, pois esta é uma função lambda.
Experimente online!
fonte
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
, pensando que era 1 byte a mais.Python3 -
3130 bytesGuardou um byte graças a @Dennis!
Eu não estava planejando uma resposta embutida, mas encontrei este módulo e achei muito legal, porque não fazia ideia de que ele existia.
Experimente online aqui .
fonte
from statistics import*;median
salva um byte.__import__
, masimport math;math.log
superariafrom math import*;log
.Na verdade , 1 byte
Experimente online!
fonte
Geléia , 9 bytes
Experimente online!
Explicação
Ainda estou pegando o jeito de Jelly ... não consegui encontrar os componentes internos para a mediana ou a média de uma lista, mas é muito conveniente para esse desafio que o Jelly permita que índices não inteiros sejam incluídos nas listas, nesse caso, ele retornará um par dos dois valores mais próximos. Isso significa que podemos trabalhar com metade do comprimento da entrada como índice e obter um par de valores quando precisarmos calculá-lo.
fonte
Æṁ
vai trabalhar agoraFlak cerebral , 914 + 1 = 915 bytes
Requer que o
-A
sinalizador seja executado.Experimente online!
Explicação
A espinha dorsal desse algoritmo é uma espécie de bolha que escrevi há algum tempo.
Não me lembro como isso funciona, então não me pergunte. Mas sei que classifica a pilha e até funciona para negativos
Depois que tudo foi resolvido, encontro 2 vezes a mediana com o seguinte pedaço
Agora tudo o que resta é converter para ASCII
fonte
R, 6 bytes
Not surprising that R, a statistical programming language, has this built-in.
fonte
R
beating Jelly :D:D:DMATL, 4 bytes
This finds the 0.5-quantile, which is the median.
Try it online!
fonte
i
that you suggested to make implicit? :-PPyth - 11 bytes
Finds the average of the middle item taken both backwards and forwards.
Test Suite.
fonte
Octave, 38 bytes
This defines an anonymous function. Input is a row vector.
Try it online!
Explanation
fonte
bsxfun
" andmean
:-)JavaScript,
5752 bytesSort the array numerically. If the array is an even length, find the 2 middle numbers and average them. If the array is odd, find the middle number twice and divide by 2.
fonte
Array.sort()
doesn't work properly with decimalssort()
directly and getting rid of thet
variable:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
, this would fail.>>
is a sign-propagating right shift, meaning that when the number is interpreted as a 32 bit integer, if the msb is set, then it stays set, making the result negative for2**32>x>=2**31
. Forx>=2**32
, it just yields0
.Matlab/Octave, 6 bytes
A boring built-in:
Try it online!
fonte
@median
?Mathematica, 6 bytes
As soon as I figure out Mthmtca, I'm posting a solution in it.
fonte
CBC8
(ËÈ
). However, until I apply another patch, the notion of function-calling might not meet PPCG's standards.Perl 6, 31 bytes
Try it
Expanded:
fonte
APL (Dyalog Unicode), 14 bytes
Try it online!
This is a train. The original dfn was
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.The train is structured as follows
⊢
denotes the right argument.⌷
index⊂∘⍋
the indices which indexed into⊢
results in⊢
being sorted÷∘2
into⊢
divided by 22/
replicate this twice, so1 5 7 8
becomes1 1 5 5 7 7 8 8
2+/
take the pairwise sum, this becomes(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
from this pick≢
element with index equal to the length of⊢
Previous solutions
fonte
Common Lisp, 89
I compute the mean of elements at position
(floor middle)
and(ceiling middle)
, wheremiddle
is the zero-based index for the middle element of the sorted list. It is possible formiddle
to be a whole number, like1
for an input list of size 3 such as(10 20 30)
, or a fraction for lists with an even numbers of elements, like3/2
for(10 20 30 40)
. In both cases, we compute the expected median value.fonte
Vim, 62 bytes
I originally did this in V using only text manipulation until the end, but got frustrated with handling [X] and [X,Y], so here's the easy version. They're about the same length.
Try it online!
Unprintables:
Honorable mention:
^O
takes you out of insert mode for one command (the let command).^R"
inserts the text that was yanked (in this case the list)fonte
TI-Basic, 2 bytes
Very straightforward.
fonte
Ans
is not an allowed I/O method.C#, 126 bytes
Pretty straightforward, here with LINQ to order the values, skip half the list, take one or two values depending on even/odd and average them.
fonte
using System.Linq;
into your byte count, however you can cancel this out by making some changes. Compile to aFunc<float[], float>
and assign the value of the modulo to a variable for 106 bytes: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 Bytes
Thanks to @original.legin for helping me save bytes.
Usage:
fonte
float
instead ofdouble
to save two bytes. Also, on GCC, you can use#import<vector>
and#import<algorithm>
instead of#include
. (Note that you don't need the space after either the#include
or#import
)J,
1614 bytesTry it online!
In addition to BMO's array duplication trick, I found that we can add the whole array sorted in two directions. Then I realized that the two steps can be reversed, i.e. add the two arrays, then duplicate them and take the
n
th element.How it works
Previous answers
J with
stats
addon, 18 bytesTry it online!
Library function FTW.
median
's implementation looks like this:J, 31 bytes
Try it online!
How it works
A bit of golfing gives this:
J, 28 bytes
Try it online!
fonte
#{0,2+/\2#-:/:]
at a close 15 bytes (man I miss⎕io
).J, 19 bytes
Explanation:
fonte
~
directly to each<.@-:@#{/:~-:@+\:~
JavaScript, 273 Bytes
fonte
Java 7, 99 bytes
Golfed:
Ungolfed:
Try it online
fonte
java.util.Arrays
?Pari/GP - 37
39BytesLet a be a rowvector containing the values.
Since Pari/GP is interactive, no additional command is needed to display the result.
For the "try-it-online" link a line before and after is added. To get printed, the median-result in stored in variable w
Try it online!
fonte
Japt, 20 bytes
Test it online! Japt really lacks any built-ins necessary to create a really short answer for this challenge...
Explanation
fonte
Java 8, 71 bytes
Parity is fun! Here's a lambda from
double[]
toDouble
.Nothing too complex going on here. The array gets sorted, and then I take the mean of two numbers from the array. There are two cases:
s
ands-1
both divide to the index of the middle element. The number is added to itself and the result divided by two, yielding the original value.Try It Online
fonte
SmileBASIC, 45 bytes
Gets the average of the elements at floor(length/2) and floor(length/2-0.5) Very simple, but I was able to save 1 byte by moving things around:
fonte
Husk, 10 bytes
Try it online!
Explanation
This function uses that the median of[a1…aN] is the same as the median of [a1a1…aNaN] which avoids the ugly distinction of odd-/even-length lists.
Unfortunately
½
for lists has the type[a] -> [[a]]
and not[a] -> ([a],[a])
which doesn't allowF~+→←
sincefoldl1
needs a function of typea -> a -> a
as first argument, forcing me to usee
.fonte
R without using the
median
builtin, 51 bytesTry it online!
fonte
function(x)mean(x,.5)
GolfScript,
27252017 bytesTakes input as an array of integers on stdin. Outputs as an unreduced fraction. Try it online!
Explanation
The median of the array, as BMO's Husk answer explains, is equal to the median of an array twice as long where each element is repeated twice. So we concatenate the array to itself, sort, and take the mean of the middle two elements. If the length of the original array isl , the middle two elements of the doubled array are at indices l−1 and l .
The output will be something like
10/2
.fonte