Вызов
Учитывая непустой список действительных чисел, вычислите его медиану.
Определения
Медиана вычисляется следующим образом: сначала отсортируйте список,
- если количество записей нечетное , медиана является значением в центре отсортированного списка,
- в противном случае медиана - это среднее арифметическое двух значений, ближайших к центру отсортированного списка.
Примеры
[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
источник
источник
7/2
или8/2
)Ответы:
Python 2 , 48 байт
Безымянная функция, которая возвращает результат. -1 байт благодаря xnor.
Первый шаг - это, очевидно, отсортировать массив, используя
l.sort()
. Однако у нас может быть только один оператор в лямбда-выражении, поэтому мы используем тот факт, что функция сортировки возвращаетсяNone
, добавляяor
- какNone
это неверно в Python, это говорит ей о необходимости оценки и возврата следующей части оператора.Теперь у нас есть отсортированный список, нам нужно найти либо среднее, либо среднее два значения.
Использование условного выражения для проверки четности длины было бы слишком многословным, поэтому вместо этого мы получаем индексы
len(l)/2
и~len(l)/2
:Если список имеет нечетную длину, эти индексы будут указывать на одно и то же значение. Если он имеет одинаковую длину, то они будут указывать на центральные два пункта.
Теперь, когда у нас есть эти два индекса, мы находим эти значения в списке, суммируем их и делим их на 2. Завершающий десятичный знак в
/2.
гарантирует, что это деление с плавающей запятой, а не целочисленное деление.Результат неявно возвращается, так как это лямбда-функция.
Попробуйте онлайн!
источник
lambda l:l.sort()or(l[len(l)/2]+l[~len(l)/2])/2.
f=
, думая, что это на 1 байт длиннее.Python3 -
3130 байтСохраненный байт благодаря @Dennis!
Я не планировал встроенный ответ, но нашел этот модуль и подумал, что это действительно круто, потому что я понятия не имел, что он существует.
Попробуйте это онлайн здесь .
источник
from statistics import*;median
сохраняет байт.__import__
, ноimport math;math.log
лучшеfrom math import*;log
.На самом деле , 1 байт
Попробуйте онлайн!
источник
Желе , 9 байт
Попробуйте онлайн!
объяснение
Я все еще изучаю Jelly ... Я не смог найти встроенные модули для медианы или среднего значения списка, но для этой задачи очень удобно, что Jelly допускает нецелые индексы в списках, в этом случае он вернет пару из двух ближайших значений. Это означает, что мы можем работать с половиной входной длины в качестве индекса и получать пару значений, когда нам нужно ее усреднить.
источник
Æṁ
теперь будет работатьBrain-Flak , 914 + 1 = 915 байт
Требуется
-A
флаг для запуска.Попробуйте онлайн!
объяснение
Основой этого алгоритма является пузырьковая сортировка, которую я написал некоторое время назад.
Я не помню, как это работает, поэтому не спрашивайте меня. Но я знаю, что это сортирует стек и даже работает на негативы
После того, как все было отсортировано, я нахожу 2 раза медиану со следующим куском
Теперь осталось только преобразовать в ASCII
источник
R, 6 байт
Не удивительно, что R, статистический язык программирования, имеет эту встроенную функцию.
источник
R
бить Желе: D: D: DMATL , 4 байта
Это находит 0.5-квантиль, который является медианой.
Попробуйте онлайн!
источник
i
что вы предлагали сделать неявным? :-PPyth - 11 байт
Находит среднее значение среднего предмета, взятого как вперед, так и вперед.
Тестовый пакет .
источник
Октава , 38 байт
Это определяет анонимную функцию. Ввод - это вектор строки.
Попробуйте онлайн!
объяснение
источник
bsxfun
" иmean
:-)JavaScript,
5752 байтаСортировать массив численно. Если массив четной длины, найдите 2 средних числа и усредните их. Если массив нечетный, найдите среднее число дважды и разделите на 2.
источник
Array.sort()
это не работает должным образом с десятичнымиsort()
непосредственно и избавления отt
переменного:v=>(v.sort((a,b)=>a-b)[(x=v.length)>>1]+v[--x>>1])/2
x>=2**31
это не получится.>>
является признаком распространяющихся сдвиг вправо , а это означает , что , когда число интерпретируется как 32 битное целое число, если MSB установлен, то он остается установить, что делает отрицательный результат для2**32>x>=2**31
. Ибоx>=2**32
это просто дает0
.Matlab / Octave, 6 байтов
Скучный встроенный:
Попробуйте онлайн!
источник
@median
?Mathematica, 6 байтов
Как только я выясняю Mthmtca , я выкладываю решение в нем.
источник
CBC8
(ËÈ
). Однако до тех пор, пока я не применю другой патч, понятие вызова функций может не соответствовать стандартам PPCG.Perl 6 , 31 байт
Попытайся
Expanded:
источник
APL (Dyalog Unicode) , 14 байтов
Попробуйте онлайн!
Это поезд. Оригинальный дфн был
{(2+/2/⍵[⍋⍵])[≢⍵]÷2}
.Поезд построен следующим образом
⊢
обозначает правильный аргумент.⌷
показатель⊂∘⍋
индексы, которые проиндексированы в⊢
результате⊢
сортировки÷∘2
в⊢
делении на 22/
повторить это дважды, так1 5 7 8
становится1 1 5 5 7 7 8 8
2+/
взять попарную сумму, это становится(1+1)(1+5)(5+5)(5+7)(7+7)(7+8)(8+8)
⊃
из этого выбора≢
элемент с индексом, равным длине⊢
Предыдущие решения
источник
Common Lisp, 89
Я вычисляю среднее значение элементов в позиции
(floor middle)
и(ceiling middle)
гдеmiddle
нулевой индекс для среднего элемента отсортированного списка. Это можетmiddle
быть целое число, например,1
для входного списка размером 3, например(10 20 30)
, или дробь для списков с четным числом элементов, например3/2
для(10 20 30 40)
. В обоих случаях мы вычисляем ожидаемое среднее значение.источник
Vim, 62 байта
Первоначально я делал это в V, используя только текстовые манипуляции до конца, но разочаровался в обработке [X] и [X, Y], так что вот простая версия. Они примерно одинаковой длины.
Попробуйте онлайн!
непечатные:
Похвальный отзыв:
^O
выводит вас из режима вставки для одной команды (команда let).^R"
вставляет текст, который был выдернут (в данном случае список)источник
TI-Basic, 2 байта
Очень просто.
источник
Ans
не разрешен метод ввода / вывода .C #, 126 байт
Довольно просто, здесь с LINQ, чтобы упорядочить значения, пропустить половину списка, взять одно или два значения в зависимости от четного / нечетного и усреднить их.
источник
using System.Linq;
в свой счетчик байтов, однако вы можете отменить это, внеся некоторые изменения. Скомпилируйте в aFunc<float[], float>
и присвойте значение по модулю переменной для 106 байтов: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 байт
Спасибо @ original.legin за помощь в экономии байтов.
Использование:
источник
float
вместо того,double
чтобы сохранить два байта. Также в GCC вы можете использовать#import<vector>
и#import<algorithm>
вместо#include
. (Обратите внимание, что вам не нужно пробел после или#include
или#import
)J ,
1614 байтПопробуйте онлайн!
В дополнение к уловке дублирования массива BMO , я обнаружил, что мы можем добавить весь массив, отсортированный в двух направлениях. Тогда я понял, что два шага можно поменять местами, т.е. добавить два массива, затем продублировать их и взять
n
элемент th.Как это работает
Предыдущие ответы
J с
stats
аддоном, 18 байтПопробуйте онлайн!
Функция библиотеки FTW.
median
Реализация выглядит так:J , 31 байт
Попробуйте онлайн!
Как это работает
Немного игры в гольф дает это:
J , 28 байт
Попробуйте онлайн!
источник
#{0,2+/\2#-:/:]
в 15 байтах (человек, которого я скучаю⎕io
).J, 19 байт
Объяснение:
источник
~
непосредственно к каждому<.@-:@#{/:~-:@+\:~
JavaScript, 273 байта
источник
Java 7, 99 байт
Golfed:
Ungolfed:
Попробуйте онлайн
источник
java.util.Arrays
?Пари / ГП - 37
39байтПусть a будет вектор-строкой, содержащей значения.
Поскольку Pari / GP является интерактивным, для отображения результата не требуется никаких дополнительных команд.
Для ссылки "попробуй это онлайн" добавлена строка до и после. Чтобы получить печать, медиана-результат хранится в переменной w
Попробуйте онлайн!
источник
Japt, 20 байт
Проверьте это онлайн! Джапту действительно не хватает встроенных модулей, необходимых для создания действительно короткого ответа на этот вызов ...
объяснение
источник
Java 8, 71 байт
Четность это весело! Вот лямбда от
double[]
доDouble
.Ничего слишком сложного здесь не происходит. Массив сортируется, а затем я беру среднее из двух чисел из массива. Есть два случая:
s
иs-1
оба делятся на индекс среднего элемента. Число добавляется к самому себе, а результат делится на два, давая исходное значение.Попробуйте онлайн
источник
SmileBASIC, 45 байт
Получает среднее значение элементов на этаже (длина / 2) и этаже (длина / 2-0,5). Очень просто, но мне удалось сэкономить 1 байт, перемещая объекты:
источник
Шелуха , 10 байт
Попробуйте онлайн!
объяснение
К сожалению,
½
для списков есть тип,[a] -> [[a]]
а не тот,[a] -> ([a],[a])
который не позволяет,F~+→←
так какfoldl1
нуждается в функции типа вa -> a -> a
качестве первого аргумента, заставляя меня использоватьe
.источник
R без использования
median
встроенного, 51 байтПопробуйте онлайн!
источник
function(x)mean(x,.5)
GolfScript ,
27252017 байтПринимает ввод как массив целых чисел на стандартном вводе. Выходы как невосстановленная дробь. Попробуйте онлайн!
объяснение
На выходе будет что-то вроде
10/2
.источник