Колода карт - это декартово произведение S
мастей и R
рангов. Многие, хотя и не все, карточные игры используют S=4
и R∊{6,8,13}
. Рука H
карт раздается из колоды. Его распределение , также называемое «комбинация рук», представляет собой массив, который описывает, сколько карт вы получили от каждой масти, игнорируя порядок мастей (таким образом, это похоже на мульти-сет). Учитывая распределение D
удовлетворяющего len(D)=S
, 1≤sum(D)=H≤S×R
, 0≤D[i]≤R
, D[i]≥D[i+1]
, найти вероятность его возникновение.
Ввод: целое число R
и массив D
.
Вывод: вероятность не менее 5 цифр после десятичной запятой; конечные нули могут быть пропущены; научная запись в порядке.
Лазейки запрещены. Кратчайшие победы.
тесты:
R D probability
13 4 4 3 2 -> 0.2155117564516334148528314355068773
13 5 3 3 2 -> 0.1551684646451760586940386335649517
13 9 3 1 0 -> 0.0001004716813294328274372174524508
13 13 0 0 0 -> 0.0000000000062990780897964308603403
8 3 2 2 1 -> 0.4007096203759162602321667950144035
8 4 2 1 1 -> 0.1431105787056843786543452839337155
8 2 2 1 0 -> 0.3737486095661846496106785317018910
8 3 1 1 0 -> 0.2135706340378197997775305895439377
15 4 4 3 2 1 -> 0.1428926269185580521441708109954798
10 3 0 0 -> 0.0886699507389162561576354679802956
10 2 1 0 -> 0.6650246305418719211822660098522167
10 1 1 1 -> 0.2463054187192118226600985221674877
Смотрите также Мостовые комбинации рук в Википедии .
РЕДАКТИРОВАТЬ: исключено ненужное ограничение H≤R
РЕДАКТИРОВАТЬ: добавлено ограничение H≥1
Ответы:
APL (Dyalog Unicode) , 30 символов
Попробуйте онлайн!
Используя формулу @ orlp .
источник
Python 3, 134 байта
Формула является произведением
binom(R, d)
для каждого элементаd
вD
, разfactorial(len(D))
, деленным на произведениеfactorial(len(S))
для каждогоS
в группировкахD
(например,[4, 4, 3, 2]
имеет группировки[[4, 4], [3], [2]]
), и, наконец, делится наbinom(len(D) * R, sum(D))
.Или в математической записи, предполагая, что m содержит кратности n уникальных элементов в D :
источник
i=0
для обозначенияb()
и используетR,D
дляn,k
).R ,
908583 байтПопробуйте онлайн!
Я наблюдал то же самое, что и orlp , но я выбрал хороший язык со встроенными комбинаториками.
Объяснение:
источник
"<"=choose
(вне функции) и потенциально использовать seq в зависимости от ответа ngn на комментарий, который я разместил сегодня утром.Желе ,
2220 байт-2 байта, используя новый быстрый
ʋ
и новый монадический атомẈ
Диадическая связь с распределенным распределением D слева и числом рангов R справа, которая возвращает вероятность возникновения.
Попробуйте онлайн! или посмотрите набор тестов
Как?
источник
05AB1E , 21 байт
Попробуйте онлайн!
объяснение
источник
Pyth , 32 байта
Попробуй это здесь! или проверьте все контрольные примеры!
Как это работает?
источник
APL (Dyalog) , 42 байта
Попробуйте онлайн!
Все еще играю в гольф.
источник
Clojure, 153 байта
Просто имитация грубой силы, чтобы получить большую точность, увеличьте количество итераций и значение «1 / N» в конце соответственно. Первым аргументом является количество, а вторым - количество карт в колоде на комплект.
источник
J, 57 байт
Попробуйте онлайн!
Это работает в O (гольф) и будет подавлять многие из тестовых случаев (хотя работает теоретически), что было бы хорошо, если бы он был в гольф. Но я застрял на том, чтобы урезать его, особенно во избежание повторения
"1
. Если кто-то хочет помочь, вот разобранная версия ...Правая сторона основного форка - это все возможные варианты колоды , а левая сторона основного форка - это просто исходный правый аргумент, то есть маска костюма, с которой мы сопоставляемся.
Внутри каждой «перетасованной» колоды мы берем из первых рук элементы, затем группируем их по ключу,
/.
сортируем результат и проверяем, соответствует ли это рассматриваемой маске костюма. Мы складываем общее количество совпадений и делим его на длину всех возможных колод.источник
f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@]
TIO