Défi
Étant donné une liste non vide de nombres réels, calculez sa médiane.
Définitions
La médiane est calculée comme suit: triez d'abord la liste,
- si le nombre d'entrées est impair , la médiane est la valeur au centre de la liste triée,
- sinon la médiane est la moyenne arithmétique des deux valeurs les plus proches du centre de la liste triée.
Exemples
[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
la source
la source
7/2
ou8/2
)Réponses:
Python 2 , 48 octets
Une fonction sans nom qui renvoie le résultat. -1 octet grâce à xnor.
La première étape consiste évidemment à trier le tableau à l'aide de
l.sort()
. Cependant, nous ne pouvons avoir qu'une seule instruction dans un lambda, nous utilisons donc le fait que la fonction de tri renvoieNone
en ajoutant unor
- commeNone
c'est faux dans Python, cela lui dit d'évaluer et de renvoyer la partie suivante de l'instruction.Maintenant que nous avons la liste triée, nous devons trouver les valeurs du milieu ou les deux du milieu.
L'utilisation d'un conditionnel pour vérifier la parité de la longueur serait trop verbeuse, donc à la place nous obtenons les index
len(l)/2
et~len(l)/2
:Si la liste est de longueur impaire, ces index pointeront vers la même valeur. S'il est de même longueur, alors ils pointeront vers les deux éléments centraux.
Maintenant que nous avons ces deux index, nous trouvons ces valeurs dans la liste, les additionnons et les divisons par 2. La décimale de fin dans
/2.
s'assure qu'il s'agit d'une division flottante plutôt que d'une division entière.Le résultat est implicitement renvoyé, car il s'agit d'une fonction lambda.
Essayez-le en ligne!
la source
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
, pensant que c'était 1 octet de plus.Python3 -
3130 octetsUn octet enregistré grâce à @Dennis!
Je ne prévoyais pas de réponse intégrée, mais j'ai trouvé ce module et j'ai pensé que c'était vraiment cool parce que je ne savais pas qu'il existait.
Essayez-le en ligne ici .
la source
from statistics import*;median
enregistre un octet.__import__
, maisimport math;math.log
battaitfrom math import*;log
.En fait , 1 octet
Essayez-le en ligne!
la source
Gelée , 9 octets
Essayez-le en ligne!
Explication
Je suis toujours en train de comprendre Jelly ... Je n'ai pas pu trouver des éléments intégrés pour la médiane ou la moyenne d'une liste, mais il est très pratique pour ce défi que Jelly autorise des indices non entiers dans les listes, auquel cas il renverra une paire des deux valeurs les plus proches. Cela signifie que nous pouvons travailler avec la moitié de la longueur d'entrée en tant qu'index et obtenir une paire de valeurs lorsque nous devons la moyenne.
la source
Æṁ
cela fonctionnera maintenantBrain-Flak , 914 + 1 = 915 octets
Requiert le
-A
drapeau pour fonctionner.Essayez-le en ligne!
Explication
L'épine dorsale de cet algorithme est une sorte de bulle que j'ai écrite il y a quelque temps.
Je ne me souviens pas comment cela fonctionne, alors ne me demandez pas. Mais je sais que cela trie la pile et fonctionne même pour les négatifs
Après que tout a été trié, je trouve 2 fois la médiane avec le morceau suivant
Maintenant, tout ce qui reste est de faire la conversion en ASCII
la source
R, 6 octets
Pas étonnant que R, un langage de programmation statistique, dispose de cette fonction intégrée.
la source
R
battre Jelly: D: D: DMATL , 4 octets
Cela trouve le 0,5-quantile, qui est la médiane.
Essayez-le en ligne!
la source
i
que vous avez suggéré de rendre implicite? :-PPyth - 11 octets
Recherche la moyenne de l'élément du milieu pris à la fois en arrière et en avant.
Suite de test .
la source
Octave , 38 octets
Cela définit une fonction anonyme. L'entrée est un vecteur ligne.
Essayez-le en ligne!
Explication
la source
bsxfun
" etmean
:-)JavaScript,
5752 octetsTriez le tableau numériquement. Si le tableau est de longueur paire, trouvez les 2 nombres du milieu et faites-en la moyenne. Si le tableau est impair, trouvez le nombre du milieu deux fois et divisez par 2.
la source
Array.sort()
cela ne fonctionne pas correctement avec les décimalessort()
directement et en vous débarrassant de lat
variable:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
cela échouait.>>
est un décalage vers la droite de propagation de signe , ce qui signifie que lorsque le nombre est interprété comme un entier de 32 bits, si le msb est défini, il reste défini, ce qui rend le résultat négatif pour2**32>x>=2**31
. Carx>=2**32
, ça cède juste0
.Matlab / Octave, 6 octets
Un ennuyeux intégré:
Essayez-le en ligne!
la source
@median
?Mathematica, 6 octets
Dès que j'ai compris Mthmtca , j'y poste une solution.
la source
CBC8
(ËÈ
). Cependant, jusqu'à ce que j'applique un autre patch, la notion d'appel de fonction pourrait ne pas répondre aux normes de PPCG.Perl 6 , 31 octets
L'essayer
Étendu:
la source
APL (Dyalog Unicode) , 14 octets
Essayez-le en ligne!
Ceci est un train. Le DFN d'origine était
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.Le train est structuré comme suit
⊢
désigne le bon argument.⌷
indice⊂∘⍋
les indices qui se sont indexés en⊢
résultats à⊢
trier÷∘2
en⊢
divisé par 22/
reproduire cela deux fois,1 5 7 8
devient1 1 5 5 7 7 8 8
2+/
prendre la somme par paire, cela devient(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
de ce choix≢
élément d'index égal à la longueur de⊢
Solutions précédentes
la source
Lisp commun, 89
Je calcule la moyenne des éléments en position
(floor middle)
et(ceiling middle)
, oùmiddle
est l'indice de base zéro pour l'élément central de la liste triée. Il est possible que cemiddle
soit un nombre entier, comme1
pour une liste d'entrée de taille 3 comme(10 20 30)
, ou une fraction pour des listes avec un nombre pair d'éléments, comme3/2
pour(10 20 30 40)
. Dans les deux cas, nous calculons la valeur médiane attendue.la source
Vim, 62 octets
À l'origine, j'ai fait cela en V en utilisant uniquement la manipulation de texte jusqu'à la fin, mais je suis frustré de gérer [X] et [X, Y], alors voici la version facile. Ils ont à peu près la même longueur.
Essayez-le en ligne!
Non imprimables:
Mention honorable:
^O
vous fait sortir du mode d'insertion pour une commande (la commande let).^R"
insère le texte qui a été retiré (dans ce cas la liste)la source
TI-Basic, 2 octets
Très simple.
la source
Ans
n'est pas une méthode d'E / S autorisée .C #, 126 octets
Assez simple, ici avec LINQ pour ordonner les valeurs, sauter la moitié de la liste, prendre une ou deux valeurs en fonction de pair / impair et les faire la moyenne.
la source
using System.Linq;
dans votre nombre d'octets, mais vous pouvez l'annuler en faisant quelques changements. Compilez vers aFunc<float[], float>
et affectez la valeur du modulo à une variable pour 106 octets: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 octets
Merci à @ original.legin de m'avoir aidé à économiser des octets.
Usage:
la source
float
au lieu dedouble
pour enregistrer deux octets. En outre, sur GCC, vous pouvez utiliser#import<vector>
et#import<algorithm>
au lieu de#include
. (Notez que vous n'avez pas besoin de l'espace après le#include
ou#import
)J ,
1614 octetsEssayez-le en ligne!
En plus de l'astuce de duplication des baies de BMO , j'ai constaté que nous pouvons ajouter la totalité du tableau trié dans deux directions. Ensuite, j'ai réalisé que les deux étapes peuvent être inversées, c'est-à-dire ajouter les deux tableaux, puis les dupliquer et prendre le
n
e élément.Comment ça marche
Réponses précédentes
J avec
stats
addon, 18 octetsEssayez-le en ligne!
Fonction de bibliothèque FTW.
median
L'implémentation de ceci ressemble à ceci:J , 31 octets
Essayez-le en ligne!
Comment ça marche
Un peu de golf donne ceci:
J , 28 octets
Essayez-le en ligne!
la source
#{0,2+/\2#-:/:]
à 15 octets près (homme qui me manque⎕io
).J, 19 octets
Explication:
la source
~
directement à chacun<.@-:@#{/:~-:@+\:~
JavaScript, 273 octets
la source
Java 7, 99 octets
Golfé:
Ungolfed:
Essayez-le en ligne
la source
java.util.Arrays
?Pari / GP - 37
39octetsSoit a un vecteur ligne contenant les valeurs.
Puisque Pari / GP est interactif, aucune commande supplémentaire n'est nécessaire pour afficher le résultat.
Pour le lien "essayer en ligne" , une ligne avant et après est ajoutée. Pour être imprimé, le résultat médian est stocké dans la variable w
Essayez-le en ligne!
la source
Japt, 20 octets
Testez-le en ligne! Japt n'a vraiment pas les éléments nécessaires pour créer une réponse très courte à ce défi ...
Explication
la source
Java 8, 71 octets
La parité est amusante! Voici un lambda de
double[]
àDouble
.Rien de trop complexe ne se passe ici. Le tableau est trié, puis je prends la moyenne de deux nombres du tableau. Il y a deux cas:
s
et less-1
deux se divisent à l'indice de l'élément central. Le nombre est ajouté à lui-même et le résultat divisé par deux, ce qui donne la valeur d'origine.Essayez-le en ligne
la source
SmileBASIC, 45 octets
Obtient la moyenne des éléments au sol (longueur / 2) et au sol (longueur / 2-0,5) Très simple, mais j'ai pu économiser 1 octet en déplaçant les choses:
la source
Coque , 10 octets
Essayez-le en ligne!
Explication
Malheureusement
½
pour les listes a le type[a] -> [[a]]
et non[a] -> ([a],[a])
ce qui ne permet pasF~+→←
car afoldl1
besoin d'une fonction de typea -> a -> a
comme premier argument, me forçant à utilisere
.la source
R sans utiliser la fonction
median
intégrée, 51 octetsEssayez-le en ligne!
la source
function(x)mean(x,.5)
GolfScript ,
27252017 octetsPrend l'entrée comme un tableau d'entiers sur stdin. Sorties sous forme de fraction non réduite. Essayez-le en ligne!
Explication
La sortie sera quelque chose comme
10/2
.la source