Reto
Dada una lista no vacía de números reales, calcule su mediana.
Definiciones
La mediana se calcula de la siguiente manera: primero ordena la lista,
- si el número de entradas es impar , la mediana es el valor en el centro de la lista ordenada,
- de lo contrario, la mediana es la media aritmética de los dos valores más cercanos al centro de la lista ordenada.
Ejemplos
[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
falla
fuente
fuente
7/2
o8/2
)Respuestas:
Python 2 , 48 bytes
Una función sin nombre que devuelve el resultado. -1 byte gracias a xnor.
El primer paso es obviamente ordenar la matriz, usando
l.sort()
. Sin embargo, solo podemos tener una declaración en una lambda, por lo que utilizamos el hecho de que la función de clasificación regresaNone
agregando unor
- comoNone
es falso en Python, esto le dice que evalúe y devuelva la siguiente parte de la declaración.Ahora que tenemos la lista ordenada, necesitamos encontrar los valores intermedios o intermedios.
Usar un condicional para verificar la paridad de la longitud sería demasiado detallado, por lo que en su lugar obtenemos los índices
len(l)/2
y~len(l)/2
:Si la lista tiene una longitud impar, estos índices apuntarán al mismo valor. Si es de longitud uniforme, apuntarán a los dos elementos centrales.
Ahora que tenemos estos dos índices, encontramos estos valores en la lista, los sumamos y los dividimos entre 2. El lugar decimal al final
/2.
se asegura de que sea una división flotante en lugar de una división entera.El resultado se devuelve implícitamente, ya que esta es una función lambda.
Pruébalo en línea!
fuente
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
, pensando que era 1 byte más.Python3 -
3130 bytes¡Ahorré un byte gracias a @Dennis!
No estaba planeando una respuesta integrada, pero encontré este módulo y pensé que era realmente genial porque no tenía idea de que existía.
Pruébelo en línea aquí .
fuente
from statistics import*;median
guarda un byte.__import__
, peroimport math;math.log
venceríafrom math import*;log
.En realidad , 1 byte
Pruébalo en línea!
fuente
Jalea , 9 bytes
Pruébalo en línea!
Explicación
Todavía estoy entendiendo a Jelly ... No pude encontrar elementos integrados para la mediana o el promedio de una lista, pero es muy conveniente para este desafío que Jelly permita índices no enteros en las listas, en cuyo caso devolverá un par de los dos valores más cercanos. Eso significa que podemos trabajar con la mitad de la longitud de entrada como índice y obtener un par de valores cuando necesitamos promediarlo.
fuente
Æṁ
funcionará ahoraBrain-Flak , 914 + 1 = 915 bytes
Requiere la
-A
bandera para correr.Pruébalo en línea!
Explicación
La columna vertebral de este algoritmo es un tipo de burbuja que escribí hace un tiempo.
No recuerdo cómo funciona esto, así que no me preguntes. Pero sí sé que ordena la pila e incluso funciona para negativos
Después de que todo ha sido ordenado, encuentro 2 veces la mediana con el siguiente fragmento
Ahora todo lo que queda es convertir a ASCII
fuente
R, 6 bytes
No es sorprendente que R, un lenguaje de programación estadística, tenga esto incorporado.
fuente
R
derrotar a Jelly: D: D: DMATL , 4 bytes
Esto encuentra el cuantil 0.5, que es la mediana.
Pruébalo en línea!
fuente
i
que sugirió hacer implícito? :-PPyth - 11 bytes
Encuentra el promedio del elemento medio tomado hacia atrás y hacia adelante.
Test Suite .
fuente
Octava , 38 bytes
Esto define una función anónima. La entrada es un vector de fila.
Pruébalo en línea!
Explicación
fuente
bsxfun
" ymean
:-)JavaScript,
5752 bytesOrdenar la matriz numéricamente. Si la matriz tiene una longitud par, encuentre los 2 números intermedios y promedie. Si la matriz es impar, encuentre el número del medio dos veces y divídalo entre 2.
fuente
Array.sort()
no funciona correctamente con decimalessort()
directamente y deshaciéndose de lat
variable:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
esto fallara.>>
es un desplazamiento a la derecha de propagación de signos , lo que significa que cuando el número se interpreta como un entero de 32 bits, si se establece el msb, entonces permanece establecido, lo que hace que el resultado sea negativo2**32>x>=2**31
. Porquex>=2**32
, simplemente cede0
.Matlab / Octave, 6 bytes
Un aburrido incorporado:
Pruébalo en línea!
fuente
@median
?Mathematica, 6 bytes
Tan pronto como descubro Mthmtca , publico una solución en él.
fuente
CBC8
(ËÈ
). Sin embargo, hasta que aplique otro parche, la noción de llamada a funciones podría no cumplir con los estándares de PPCG.Perl 6 , 31 bytes
Intentalo
Expandido:
fuente
APL (Dyalog Unicode) , 14 bytes
Pruébalo en línea!
Este es un tren. El dfn original era
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.El tren está estructurado de la siguiente manera
⊢
denota el argumento correcto.⌷
índice⊂∘⍋
los índices que se indexaron en⊢
resultados en⊢
ser ordenados÷∘2
en⊢
dividida por 22/
replicar esto dos veces, entonces se1 5 7 8
convierte1 1 5 5 7 7 8 8
2+/
tomar la suma por pares, esto se convierte en(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
de esta selección≢
elemento con índice igual a la longitud de⊢
Soluciones anteriores
fuente
Lisp común, 89
Calculo la media de los elementos en la posición
(floor middle)
y(ceiling middle)
, dondemiddle
está el índice de base cero para el elemento central de la lista ordenada. Es posiblemiddle
que sea un número entero, como1
para una lista de entrada de tamaño 3 como(10 20 30)
, o una fracción para listas con un número par de elementos, como3/2
para(10 20 30 40)
. En ambos casos, calculamos el valor medio esperado.fuente
Vim, 62 bytes
Originalmente hice esto en V usando solo manipulación de texto hasta el final, pero me sentí frustrado con el manejo de [X] y [X, Y], así que aquí está la versión fácil. Tienen aproximadamente la misma longitud.
Pruébalo en línea!
No imprimibles
Mención de Honor:
^O
lo saca del modo de inserción para un comando (el comando let).^R"
inserta el texto que se tiró (en este caso, la lista)fuente
TI-Basic, 2 bytes
Muy sencillo
fuente
Ans
No es un método de E / S permitido .C #, 126 bytes
Bastante sencillo, aquí con LINQ para ordenar los valores, omitir la mitad de la lista, tomar uno o dos valores dependiendo de pares / impares y promediarlos.
fuente
using System.Linq;
en su recuento de bytes, sin embargo, puede cancelar esto haciendo algunos cambios. Compile enFunc<float[], float>
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
Gracias a @ original.legin por ayudarme a guardar bytes.
Uso:
fuente
float
lugar dedouble
guardar dos bytes. Además, en GCC, puede usar#import<vector>
y en#import<algorithm>
lugar de#include
. (Tenga en cuenta que no necesita el espacio después de#include
o#import
)J ,
1614 bytesPruébalo en línea!
Además del truco de duplicación de matrices de BMO , descubrí que podemos agregar toda la matriz ordenada en dos direcciones. Luego me di cuenta de que los dos pasos pueden invertirse, es decir, agregar las dos matrices, luego duplicarlas y tomar el
n
elemento th.Cómo funciona
Respuestas anteriores
J con
stats
complemento, 18 bytesPruébalo en línea!
Función de biblioteca FTW.
median
La implementación de esta se ve así:J , 31 bytes
Pruébalo en línea!
Cómo funciona
Un poco de golf da esto:
J , 28 bytes
Pruébalo en línea!
fuente
#{0,2+/\2#-:/:]
cerca de 15 bytes (hombre que extraño⎕io
).J, 19 bytes
Explicación:
fuente
~
directamente a cada uno<.@-:@#{/:~-:@+\:~
JavaScript, 273 bytes
fuente
Java 7, 99 bytes
Golfizado:
Sin golf:
Pruébalo en línea
fuente
java.util.Arrays
?Pari / GP - 37
39BytesVamos a ser un rowvector que contiene los valores.
Como Pari / GP es interactivo, no se necesita ningún comando adicional para mostrar el resultado.
Para el enlace "pruébelo en línea" se agrega una línea antes y después. Para imprimirse, el resultado medio se almacena en la variable w
Pruébalo en línea!
fuente
Japt, 20 bytes
¡Pruébelo en línea! Japt realmente carece de los elementos necesarios para crear una respuesta realmente corta para este desafío ...
Explicación
fuente
Java 8, 71 bytes
¡La paridad es divertida! Aquí hay una lambda de
double[]
aDouble
.Aquí no pasa nada demasiado complejo. La matriz se ordena, y luego tomo la media de dos números de la matriz. Hay dos casos:
s
ys-1
ambos se dividen en el índice del elemento medio. El número se agrega a sí mismo y el resultado se divide entre dos, produciendo el valor original.Pruébalo en línea
fuente
SmileBASIC, 45 bytes
Obtiene el promedio de los elementos en el piso (longitud / 2) y el piso (longitud / 2-0.5) Muy simple, pero pude ahorrar 1 byte moviendo las cosas:
fuente
Casco , 10 bytes
Pruébalo en línea!
Explicación
Desafortunadamente
½
para las listas tiene el tipo[a] -> [[a]]
y no[a] -> ([a],[a])
lo que no permite,F~+→←
ya quefoldl1
necesita una función de tipoa -> a -> a
como primer argumento, lo que me obliga a usare
.fuente
R sin usar el
median
incorporado, 51 bytesPruébalo en línea!
fuente
function(x)mean(x,.5)
GolfScript ,
27252017 bytesToma datos como una matriz de enteros en stdin. Salidas como una fracción no reducida. Pruébalo en línea!
Explicación
La salida será algo así
10/2
.fuente