В статистике иногда полезно знать, поступают ли две выборки данных из одного базового распределения. Один из способов сделать это - использовать двухэлементный критерий Колмогорова-Смирнова .
Ваша задача будет состоять в том, чтобы написать программу, которая считывает два неотсортированных целых неотрицательных массива и вычисляет основную статистику, использованную в тесте.
Дан массив A
и вещественное число x
, определить функцию распределения F
по
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Учитывая два массива A1
и A2
, определить
D(x) = |F(A1, x) - F(A2, x)|
Статистика Колмогорова-Смирнова с двумя выборками является максимальным значением D
над всеми действительными x
.
пример
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Потом:
D(1) = |2/6 - 0| = 1/3
D(2) = |3/6 - 0| = 1/2
D(3) = |4/6 - 1/4| = 5/12
D(4) = |5/6 - 3/4| = 1/12
D(5) = |5/6 - 4/4| = 1/6
D(6) = |6/6 - 4/4| = 0
KS-статистика для двух массивов - 1/2
это максимальное значение D
.
Контрольные примеры
[0] [0] -> 0.0
[0] [1] -> 1.0
[1, 2, 3, 4, 5] [2, 3, 4, 5, 6] -> 0.2
[3, 3, 3, 3, 3] [5, 4, 3, 2, 1] -> 0.4
[1, 2, 1, 4, 3, 6] [3, 4, 5, 4] -> 0.5
[8, 9, 9, 5, 5, 0, 3] [4, 9, 0, 5, 5, 0, 4, 6, 9, 10, 4, 0, 9] -> 0.175824
[2, 10, 10, 10, 1, 6, 7, 2, 10, 4, 7] [7, 7, 9, 9, 6, 6, 5, 2, 7, 2, 8] -> 0.363636
правила
- Вы можете написать функцию или полную программу. Ввод может быть через STDIN или аргумент функции, а вывод может быть через STDOUT или возвращаемое значение.
- Вы можете принять любой однозначный список или строковый формат для ввода, если он совместим для обоих массивов
- Если у вашего языка есть встроенная возможность, вы не сможете его использовать.
- Ответы должны быть правильными как минимум до 3 значащих цифр
- Это код-гольф , поэтому программа с наименьшим количеством байтов выигрывает
code-golf
array-manipulation
Sp3000
источник
источник
A
нижеlength(A)
?)Ответы:
APL (
2924)(Спасибо Згарбу за дополнительное вдохновение.)
Это функция, которая принимает массивы в качестве левого и правого аргументов.
Объяснение:
источник
⍺⍵
! Это удобно⍳⌈/
это не нужно, так как максимум получается точно при одном из значений массива.0,
, так как он проверит это, если массив содержит его. Благодарность! (И это научит меня, как обычно, если вам нужно добавить в особом случае, это означает, что алгоритм не достаточно прост.)1
, так как это будет скаляр. Вы должны написать(,1)
вместо этого. Если вы это сделаете, это работает.J - 39
Я уверен, что можно сократить гораздо больше
использование
источник
f
если вы используете что-то вроде,>./@:|@({.-{:)f"1@,
но я не совсем уверен.Питон 3,
1321089588Ввод 2 списка для функции
g
Благодаря: Sp3000, xnor, подземный монорельс
Строка 2, первый вызов для
f
чтения, как «факс». Я нашел это немного забавнымисточник
sum(n>x for n in a)
. Кроме того, похоже, что вы не используетеs=filter
. И дляmax
вас на самом деле не нужны скобки списка; Python позволяет пареням функции удваиваться как пареням понимания.filter
в предыдущей версии, забыл удалить его. К сожалению, я не могу удалить первую пару квадратных скобок, так как тогда это будет генератор, который не имеетlen
.len
, еще раз прочитать комментарий: PJavaScript (ES6) 99
119 128Более или менее простая реализация JavaScript
, возможно, более пригодная для игры в гольф. В функции F я использую> вместо <=, так как abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))Нет больше определения функции в качестве параметра по умолчанию в этом последнем редактировании.
Как я уже сказал, это просто. Функция F - это функция F, функция D - безымянная функция, используемая в строке 2. Она оценивается с использованием .map для каждого значения, присутствующего в двух массивах, поскольку максимальное значение для
all
вещественных чисел должно быть одним из них. Наконец, оператор распространения (...) используется для передачи массива значений D в виде списка параметров в функцию max.Тест в консоли FireFox / FireBug
Выход
источник
K
: правильно ли, что вы определяете другие функцииF,D
в списке аргументов? Это ведет себя как необязательные аргументы или так?CJam,
3331 байтInput представляет собой массив стилей CJam из двух массивов.
Пример:
Выход:
Попробуйте онлайн здесь
источник
Матлаб
(121)(119)Это программа, которая принимает два списка через стандартный вывод и выводит результат в стандартный вывод. Это верный подход, и я старался играть в него как можно больше.
K(a)
возвращает функцию, которая вычисляетx -> F(a,x)
. Затем анонимная функция,@(x)abs(g(x)-h(x))
которая соответствует функцииD
, применяется к каждому возможному целому числу0:max([a,b])
и отображается максимум результатов. (arrayfun
делает то же самое, что иmap
в других языках: он применяет функцию к каждому элементу массива)источник
Эрланг, 96 байт
JavaScript-решение edc65 портировано на Erlang.
Тестовое задание:
Выход:
источник
STATA 215
Это на 90% позволяет получить ввод в формате, который можно использовать, потому что в STATA уже есть команда ksmirnov.
источник
R 65 байт
Эта функция принимает два вектора в качестве аргументов и возвращает максимальную разницу их эмпирических кумулятивных функций распределения.
Если бы встроенные модули были разрешены, это уменьшило бы до 12 байтов:
источник
Mathematica,
76 7363Mathematica имеет встроенную функцию
KolmogorovSmirnovTest
, но я не буду здесь ее использовать.Использование:
источник
Быстрое внедрение в Python 3.4.2 (79 байт):
Пример:
источник
D
, а не просто реализоватьD
как функцию. Кроме того , я прошу прощения , если я не ясно, но вы не можете предположить , чтоA1
иA2
уже определены переменные (вы можете поместить их в лямбда , хотя, например ,lambda x,A1,A2:
- это нормально)Ява -
633622 байтаХорошо, прежде всего, пытаясь стать лучше в Java, поэтому я попробовал это в Java, я знаю, что у меня никогда не получится, но это весело. во-вторых, я, честно говоря, думал, что смогу сделать это меньше, потом я дошел до того, что повсюду были двойники, и объявления методов означали, что использование методов позволило сэкономить всего 4-5 символов. короче говоря, я плохой игрок в гольф.
редактировать: формат использования> java K "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,6,6,5,2,7,2 , 8"
источник
Haskell
9683(!) - функция Колмогорова-Смирнова, которая принимает два списка
источник
map
а неfmap
; использовать,maximum
а неfoldr1 max
; определитьl=fromIntegral.length
и вы можете избавиться отi
, а затем вы можете сократить%
доl(filter(<=x)a)/l a
. Получает это до 84!R, 107 байт
Другой подход
Ungolfed
источник