Um baralho de cartas é o produto cartesiano de S
naipes e R
posições. Muitos, embora não todos, jogos de cartas usam S=4
e R∊{6,8,13}
. Uma mão de H
cartas é distribuída do baralho. Sua distribuição , também conhecida como "padrão das mãos", é uma matriz que descreve quantas cartas você recebeu de cada naipe, ignorando a ordem dos naipes (portanto, é como um conjunto múltiplo). Dada uma distribuição D
satisfatória len(D)=S
, 1≤sum(D)=H≤S×R
, 0≤D[i]≤R
, D[i]≥D[i+1]
, encontrar a probabilidade da sua ocorrência.
Entrada: um número inteiro R
e uma matriz D
.
Saída: a probabilidade com pelo menos 5 dígitos após a marca decimal; zeros à direita podem ser ignorados; notação científica está ok.
Falhas proibidas. Vitórias mais curtas.
Testes:
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
Veja também Bridge hand patterns na Wikipedia .
EDIT: eliminou restrições desnecessárias H≤R
EDIT: restrição adicionada H≥1
Respostas:
APL (Dyalog Unicode) , 30 caracteres
Experimente online!
Usando a fórmula do @ orlp .
fonte
Python 3, 134 bytes
Formula é o produto de
binom(R, d)
cada elementod
emD
, timesfactorial(len(D))
, dividido pelo produto defactorial(len(S))
cada elementoS
nos agrupamentos deD
(por exemplo,[4, 4, 3, 2]
possui agrupamentos[[4, 4], [3], [2]]
), finalmente dividido porbinom(len(D) * R, sum(D))
.Ou na notação matemática, supondo que m contenha as multiplicidades dos n elementos únicos em D :
fonte
i=0
para significarb()
e usosR,D
paran,k
).R ,
908583 bytesExperimente online!
Observei a mesma coisa que o orlp , mas escolhi uma linguagem agradável que possui componentes combinatórios.
Explicação:
fonte
"<"=choose
(fora da função) e potencialmente usar seq, dependendo da resposta da ngn ao comentário que eu publiquei esta manhã.Geléia ,
2220 bytes-2 bytes usando um novo
ʋ
átomo rápido ,, e um novo monádicoẈ
Um link diádico, com a distribuição distribuída, D, à esquerda, e o número de classificações, R, à direita, que retorna a probabilidade de ocorrência.
Experimente online! ou veja a suíte de testes
Quão?
fonte
05AB1E , 21 bytes
Experimente online!
Explicação
fonte
Pitão , 32 bytes
Experimente aqui! ou Verifique todos os casos de teste!
Como isso funciona?
fonte
APL (Dyalog) , 42 bytes
Experimente online!
Ainda jogando golfe.
fonte
Clojure, 153 bytes
Apenas uma simulação de força bruta, para obter mais precisão, aumente a contagem de iterações e o valor "1 / N" no final. O primeiro argumento é a contagem e o segundo argumento é o número de cartas no baralho por suíte.
fonte
J, 57 bytes
Experimente online!
Isso é executado em O (golfe) e afogará muitos dos casos de teste (embora funcione teoricamente), o que seria bom se fosse mais golfista. Mas eu estou preso em apará-lo, especialmente em evitar os repetidos
"1
. Se alguém quiser ajudar, aqui está a versão analisada ...O lado direito do garfo principal é o possível negócio do baralho , e o lado esquerdo do garfo principal é apenas o argumento original à direita, ou seja, a máscara do naipe com a qual estamos combinando.
No interior, de cada baralho "embaralhado", pegamos os elementos de primeira mão , depois os agrupamos usando a tecla
/.
e classificamos o resultado e verificamos se isso corresponde à máscara do traje em questão. Adicionamos o número total correspondente e o dividimos pelo comprimento de todos os decks possíveis.fonte
f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@]
TIO