Herausforderung
Berechnen Sie bei einer nicht leeren Liste reeller Zahlen den Median.
Definitionen
Der Median wird wie folgt berechnet: Sortieren Sie zuerst die Liste,
- Wenn die Anzahl der Einträge ungerade ist , ist der Median der Wert in der Mitte der sortierten Liste.
- Andernfalls ist der Median das arithmetische Mittel der beiden Werte, die der Mitte der sortierten Liste am nächsten liegen.
Beispiele
[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
Fehler
quelle
quelle
7/2
oder8/2
)Antworten:
Python 2 , 48 Bytes
Eine unbenannte Funktion, die das Ergebnis zurückgibt. -1 Byte dank xnor.
Der erste Schritt ist natürlich das Sortieren des Arrays mit
l.sort()
. In einem Lambda kann es jedoch nur eine Anweisung geben. Wir nutzen daher die Tatsache, dass die SortierfunktionNone
durch Hinzufügen einesor
- wieNone
in Python falsch - zurückgibt, um den nächsten Teil der Anweisung auszuwerten und zurückzugeben.Jetzt haben wir die sortierte Liste, wir müssen entweder die mittleren oder die mittleren zwei Werte finden.
Die Verwendung einer Bedingung zur Überprüfung der Längenparität wäre zu ausführlich. Stattdessen erhalten wir die Indizes
len(l)/2
und~len(l)/2
:Wenn die Liste ungerade lang ist, zeigen diese Indizes auf denselben Wert. Wenn es von gerader Länge ist, werden sie auf die beiden zentralen Elemente verweisen.
Nachdem wir diese beiden Indizes haben, finden wir diese Werte in der Liste, addieren sie und dividieren sie durch 2. Die nachfolgende Dezimalstelle in
/2.
stellt sicher, dass es sich um eine Gleitkommadivision und nicht um eine Ganzzahldivision handelt.Das Ergebnis wird implizit zurückgegeben, da dies eine Lambda-Funktion ist.
Probieren Sie es online!
quelle
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
und dachte, sie sei 1 Byte länger.Python3 -
3130 BytesDank @Dennis ein Byte gespart!
Ich hatte keine eingebaute Antwort geplant, aber ich fand dieses Modul und fand es wirklich cool, weil ich keine Ahnung hatte, dass es existiert.
Probieren Sie es hier online aus .
quelle
from statistics import*;median
Speichert ein Byte.__import__
,import math;math.log
würde aber schlagenfrom math import*;log
.Tatsächlich 1 Byte
Probieren Sie es online!
quelle
Gelee , 9 Bytes
Probieren Sie es online!
Erläuterung
Ich habe immer noch den Dreh raus von Jelly ... Ich konnte weder für den Median noch für den Mittelwert einer Liste integrierte Werte finden, aber für diese Herausforderung ist es sehr praktisch, dass Jelly nicht ganzzahlige Indizes in Listen zulässt. In diesem Fall wird ein Paar der beiden nächsten Werte zurückgegeben. Das heißt, wir können mit der halben Eingabelänge als Index arbeiten und ein Wertepaar abrufen, wenn wir einen Durchschnitt bilden müssen.
quelle
Æṁ
wird jetzt funktionierenBrain-Flak , 914 + 1 = 915 Bytes
Benötigt die
-A
Flagge zu laufen.Probieren Sie es online!
Erläuterung
Das Rückgrat dieses Algorithmus ist eine Blasensorte, die ich vor einiger Zeit geschrieben habe.
Ich erinnere mich nicht, wie das funktioniert, also frag mich nicht. Aber ich weiß, dass es den Stapel sortiert und sogar für Negative funktioniert
Nachdem alles sortiert wurde, finde ich 2 mal den Median mit dem folgenden Chunk
Jetzt müssen Sie nur noch in ASCII konvertieren
quelle
R, 6 Bytes
Es ist nicht verwunderlich, dass R, eine statistische Programmiersprache, über diese Funktion verfügt.
quelle
R
Jelly: D: D: D schlagenMATL , 4 Bytes
Dies findet das 0,5-Quantil, das der Median ist.
Probieren Sie es online!
quelle
i
, das du vorgeschlagen hast, implizit zu machen? :-PPyth - 11 Bytes
Ermittelt den Durchschnitt des mittleren Elements, der sowohl vorwärts als auch rückwärts aufgenommen wurde.
Test Suite .
quelle
Oktave , 38 Bytes
Dies definiert eine anonyme Funktion. Die Eingabe ist ein Zeilenvektor.
Probieren Sie es online!
Erläuterung
quelle
bsxfun
" undmean
:-)JavaScript,
5752 BytesSortieren Sie das Array numerisch. Wenn das Array eine gerade Länge hat, ermitteln Sie die 2 mittleren Zahlen und mitteln Sie sie. Wenn das Array ungerade ist, suchen Sie die mittlere Zahl zweimal und dividieren Sie durch 2.
quelle
Array.sort()
das mit Dezimalzahlen nicht richtig funktioniertsort()
direkt verwenden und diet
Variablev=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
müssten , aber wenn dies fehlschlagen würde.>>
ist eine vorzeichenausbreitende Rechtsverschiebung , dh wenn die Zahl als 32-Bit-Ganzzahl interpretiert wird, bleibt sie gesetzt, wenn das MSB gesetzt ist, und das Ergebnis wird negativ für2**32>x>=2**31
. Dennx>=2**32
es gibt einfach nach0
.Matlab / Octave, 6 Bytes
Ein langweiliges eingebautes:
Probieren Sie es online!
quelle
@median
?Mathematica, 6 Bytes
Sobald ich Mthmtca herausgefunden habe , veröffentliche ich eine Lösung darin.
quelle
CBC8
(ËÈ
). Bis ich jedoch einen anderen Patch anwende, entspricht der Begriff des Funktionsaufrufs möglicherweise nicht den PPCG-Standards.Perl 6 , 31 Bytes
Versuch es
Erweitert:
quelle
APL (Dyalog Unicode) , 14 Byte
Probieren Sie es online!
Das ist ein Zug. Die ursprüngliche DFN war
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.Der Zug ist wie folgt aufgebaut
⊢
bezeichnet das richtige Argument.⌷
Index⊂∘⍋
die Indizes , die in indexiert⊢
in Ergebnisse⊢
werden sortiert÷∘2
in⊢
geteilt durch 22/
replizieren Sie dies zweimal, so1 5 7 8
wird1 1 5 5 7 7 8 8
2+/
nimm die paarweise Summe, das wird(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
von dieser Auswahl≢
Element mit Index gleich der Länge von⊢
Bisherige Lösungen
quelle
Common Lisp, 89
Ich berechne den Mittelwert der Elemente an Position
(floor middle)
und(ceiling middle)
, womiddle
ist der auf Null basierende Index für das mittlere Element der sortierten Liste. Es kannmiddle
eine ganze Zahl sein, wie1
bei einer Eingabeliste der Größe 3(10 20 30)
, oder ein Bruch für Listen mit einer geraden Anzahl von Elementen, wie3/2
bei(10 20 30 40)
. In beiden Fällen berechnen wir den erwarteten Medianwert.quelle
Vim, 62 Bytes
Ursprünglich habe ich dies in V nur mit Textmanipulationen bis zum Ende gemacht, war aber frustriert, mit [X] und [X, Y] umzugehen. Hier ist also die einfache Version. Sie sind ungefähr gleich lang.
Probieren Sie es online!
Unbedruckbares:
Auszeichnung:
^O
Verlässt den Einfügemodus für einen Befehl (den Befehl let).^R"
fügt den Text ein, der gezerrt wurde (in diesem Fall die Liste)quelle
TI-Basic, 2 Bytes
Sehr einfach.
quelle
Ans
ist keine zulässige E / A-Methode .126 Bytes
Ganz einfach, hier mit LINQ, um die Werte zu ordnen, die Hälfte der Liste zu überspringen, ein oder zwei Werte zu nehmen, je nach Gerade / Ungerade, und sie zu mitteln.
quelle
using System.Linq;
in Ihre Byteanzahl aufnehmen, können dies jedoch durch einige Änderungen rückgängig machen. Kompilieren Sie zu aFunc<float[], float>
und weisen Sie einer Variablen für 106 Bytes den Wert desusing 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
Vielen Dank an @ original.legin, der mir geholfen hat, Bytes zu sparen.
Verwendung:
quelle
float
anstelle vondouble
zwei Bytes speichern. Auf GCC können Sie auch#import<vector>
und#import<algorithm>
anstelle von verwenden#include
. (Beachten Sie, dass Sie das Leerzeichen nach dem#include
oder nicht benötigen#import
)J ,
1614 BytesProbieren Sie es online!
Zusätzlich zum Array-Duplikationstrick von BMO konnte das gesamte Array in zwei Richtungen sortiert hinzugefügt werden. Dann erkannte ich, dass die beiden Schritte umgekehrt werden können, dh die beiden Arrays hinzufügen, dann duplizieren und das
n
th-Element nehmen.Wie es funktioniert
Vorherige Antworten
J mit
stats
Addon, 18 BytesProbieren Sie es online!
Bibliotheksfunktion FTW.
median
Die Implementierung von sieht folgendermaßen aus:J , 31 Bytes
Probieren Sie es online!
Wie es funktioniert
Ein bisschen Golf gibt dies:
J , 28 Bytes
Probieren Sie es online!
quelle
#{0,2+/\2#-:/:]
bei knapp 15 Bytes liegen (Mann, den ich vermisse⎕io
).J, 19 Bytes
Erläuterung:
quelle
~
direkt auf jede<.@-:@#{/:~-:@+\:~
JavaScript, 273 Bytes
quelle
Java 7, 99 Bytes
Golf gespielt:
Ungolfed:
Probieren Sie es online aus
quelle
java.util.Arrays
?Pari / GP - 37
39BytesSei a ein Zeilenvektor, der die Werte enthält.
Da Pari / GP interaktiv ist, ist kein zusätzlicher Befehl erforderlich, um das Ergebnis anzuzeigen.
Für den Link "Online testen" wird eine Zeile vor und nach hinzugefügt. Zum Ausdrucken wird das Median-Ergebnis in der Variablen w gespeichert
Probieren Sie es online!
quelle
Japt, 20 Bytes
Testen Sie es online! Japt fehlen wirklich alle eingebauten Funktionen, um eine wirklich kurze Antwort auf diese Herausforderung zu finden ...
Erläuterung
quelle
Java 8, 71 Bytes
Parität macht Spaß! Hier ist ein Lambda von
double[]
bisDouble
.Hier ist nichts zu komplexes los. Das Array wird sortiert, und dann nehme ich den Mittelwert aus zwei Zahlen aus dem Array. Es gibt zwei Fälle:
s
unds-1
beide teilen auf den Index des mittleren Elements. Die Zahl wird zu sich selbst addiert und das Ergebnis durch zwei geteilt, wodurch der ursprüngliche Wert erhalten wird.Probieren Sie es online
quelle
SmileBASIC, 45 Bytes
Ruft den Durchschnitt der Elemente auf Etage (Länge / 2) und Etage (Länge / 2-0,5) ab. Sehr einfach, aber ich konnte 1 Byte sparen, indem ich Dinge bewegte:
quelle
Schale , 10 Bytes
Probieren Sie es online!
Erläuterung
Leider
½
für Listen hat der Typ[a] -> [[a]]
und nicht[a] -> ([a],[a])
der, der nicht zulässt,F~+→←
dafoldl1
eine Funktion vom Typa -> a -> a
als erstes Argument benötigt und mich zwingt, zu verwendene
.quelle
R ohne Verwendung der
median
eingebauten, 51 BytesProbieren Sie es online!
quelle
function(x)mean(x,.5)
GolfScript ,
27252017 BytesÜbernimmt die Eingabe als Array von Ganzzahlen für stdin. Ausgaben als nicht reduzierter Bruch. Probieren Sie es online!
Erläuterung
Die Ausgabe wird ungefähr so aussehen
10/2
.quelle