Bir kart oyununda el desenleri


20

Bir kart destesi, Kartezyen Stakım elbise ve Rrütbeler ürünüdür . Hepsi olmasa da birçok kart oyunu S=4ve kullanır R∊{6,8,13}. Desteden bir el Hkartı dağıtılır. Onun dağılımı , namı diğer "eli desen" ise, takım elbise siparişi (yani o çok kümesi gibi) yok sayarak her takım var kaç kartlar açıklayan bir dizidir. Bir dağılım göz önüne alındığında Dtatmin edici len(D)=S, 1≤sum(D)=H≤S×R, 0≤D[i]≤R, D[i]≥D[i+1], bu oluşma olasılığını bulmak.

Girdi: bir tamsayı Rve bir dizi D.

Çıktı: ondalık işaretinden sonra en az 5 basamaklı olma olasılığı; sondaki sıfırlar atlanabilir; bilimsel gösterim iyi.

Loopholes yasaktır. En kısa kazanç.

Testler:

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

Ayrıca bkz . Wikipedia'da köprü el kalıpları .

EDIT: gereksiz kısıtlama bıraktı H≤R

EDIT: kısıtlama eklendi H≥1


D'nin sıralandığını varsayabilir miyiz?
orlp

1
@orip evet, D [i] ≥D [i + 1] ile
kastettiğim budur

Kartlar Biliyorum 1'den başlamıyorum 0 ...
RosLuP

@RosLuP ne demek istiyorsun?
ngn

Eminim bir şey anlamadım ... Kartlar 1, 2, 13, 13 numaradan temsil ediliyorsa * 4; peki, örnekte "13 0 0 0" ne anlama geliyor? 0, kart 0 anlamına mı gelir?
RosLuP

Yanıtlar:



8

Python 3, 134 bayt

b=lambda n,k:k<1or n*b(n-1,k-1)/k
f=lambda R,D,i=1,s=1,t=0:D and b(R,D[0])*i/s*f(R,D[1:],i+1,(D[0]in D[1:])*s+1,t+D[0])or 1/b(~-i*R,t)

Formül ürünü olan binom(R, d)her bir elemanı için dde Dzaman, factorial(len(D))ürünün bölünmesi, factorial(len(S))her biri için Sgruplar halinde de D(örneğin, [4, 4, 3, 2]sınıflandırır [[4, 4], [3], [2]]) ve son olarak bölünen binom(len(D) * R, sum(D)).

Veya matematik gösteriminde, m'nin D' deki n benzersiz öğenin çokluğunu içerdiği varsayılarak :

|D|!m1!m2!mn!(|D|R,ΣD)-1ΠdD(R,d)


2
kısa bir süre için beni PPCG'nin LaTeX'i desteklediğine
inandırdın

İki işlevi inlining 136 var ama belki daha fazla golf olabilir ( i=0demek için b()kullanır ve kullanır ). R,Dn,k
Jonathan Allan

7

R , 90 85 83 bayt

function(R,D,l=sum(D|1),K=choose)prod(K(R,D),1:l,1/gamma(1+table(D)))/K(R*l,sum(D))

Çevrimiçi deneyin!

Orlp ile aynı şeyi gözlemledim , ancak kombinatorik yapıları olan güzel bir dil seçtim.

Açıklama:

function(R,D,             # next are optional arguments
 l=sum(D|1),              # alias for length of D, aka S
 K=choose)                # alias for choose
  prod(                   # take the product of:
    K(R,D),               # "choose" is vectorized over R and D
    1:l,                  # S!
    1/gamma(1+            # gamma(n+1) = n! for integer n
     table(D))            # multiplicities of unique elements of D
  ) /                     # divide by
  K(R*l, sum(D))          # R*S choose H
                          # return last computation (which is all the computation)


Bununla biraz daha tasarruf edebilirsiniz: "<"=choose(fonksiyonun dışında) ve ngn'in bu sabah yayınladığım yoruma verdiği cevaba bağlı olarak potansiyel olarak seq kullanın .
JayCe

6

Jöle ,  22  20 bayt

Yeni bir hızlı ʋve yeni bir monadik atom kullanarak -2 bayt

ĠẈ!;L×c⁸S¤ʋ
L!;c@֍P

Solda dağılmış dağıtım, D, sağda rütbe sayısı, R, gerçekleşme olasılığını döndüren ikili bir bağlantı.

Çevrimiçi deneyin! veya test takımına bakın

Nasıl?

ĠẈ!;L×c⁸S¤ʋ - Link 1, denomParts: list, distribution (D); number, ranks (R)
                                                                 e.g. [3,3,3,2,2]; 8
Ġ           - group indices of D by their values                      [[4,5],[1,2,3]]
 Ẉ          - length of each group                                    [2,3]
  !         - factorial (vectorises)                                  [2,6]
          ʋ - last four links as a dyad
            - ... i.e. totalWaysToDeal = f(list, distribution (D); number, ranks (R)):
    L       - length of D                                             5
     ×      - multiply by R = total number of cards                   40
         ¤  - nilad followed by link(s) as a nilad:
       ⁸    -   chain's left argument, D                              [3,3,3,2,2]
        S   -   sum = total cards dealt                               13
      c     - binomial                                        40C13 = 12033222880
   ;        - concatenate                                             [2,6,12033222880]                                                  

L!;c@֍P - Main link: list, distribution (D); number, ranks (R)
         -                                                  e.g. [3,3,3,2,2]; 8
L        - length of D = number of suits                         5
 !       - factorial                                             120
   c@    - R binomial (vectorised across) D     (8C3=56;8C2=28)  [56,56,56,28,28]
  ;      - concatenate                                           [120,56,56,56,28,28]
      ç  - call the last link (1) as a dyad = denomParts(D,R)    [2,6,12033222880]
     ÷   - divide (vectorises)                                   [120/2,56/6,56/12033222880,56,28,28]
       P - product                                               0.11441900924883391

5

05AB1E , 21 bayt

cP¹g!*¹γ€g!P¹gI*¹Oc*/

Çevrimiçi deneyin!

açıklama

 P                      # product of
c                       # bin(input1,input2)
     *                  # multiplied by
    !                   # fac of
  ¹g                    # length of input1
                    /   # divided by
           P            # product of
          !             # fac of each
        €g              # length of each
      ¹γ                # chunk of consecutive equal elements of input1
                   *    # multiplied by
                  c     # bin of
            ¹g          # length of input1
              I*        # times input2
                ¹O      # and sum of input1

3

Pyth , 32 bayt

cc*.!lQ*F.cLvzQ*F.!hMr8Q.c*vzlQs

Burada deneyin! veya Tüm test senaryolarını doğrulayın!

Bu nasıl çalışır?

cc *.! lQ * F.cLvzQ * F..! hMr8Q.c * vzlQs ~ Tam program. D = liste, R = sayı.

   .! ~ Faktöriyel ...
     lQ ~ D uzunluğu.
  * ~ İle çarpılır ...
       * F ~ Öğelerin ürün ...
         .c ~ Arasındaki nCr ...
           LQ ~ D'nin her elemanı ve ...
            vz ~ R.
 c ~ Bölünmüş ...
               * F ~ Öğelerin ürün ...
                 .! ~ Her faktöriyel ...
                   hM ~ Kafalar. Bitişik elemanların sayısı ...
                     r8Q ~ D'nin çalışma uzunluğu kodlaması.
c ~ Bölünmüş ...
                        .c ~ Arasındaki nCr ...
                          * ~ Ürünü ...
                           vz ~ R ve ...
                             lQ ~ D uzunluğu.
                               s ~ Ve D'nin toplamı.
                                 ~ Örtük olarak çıktı.

3

APL (Dyalog) , 42 bayt

{×/(!≢⍵),(⍵!⍺),÷((+/⍵)!⍺×≢⍵),!≢¨⍵⊂⍨1,2≠/⍵}

Çevrimiçi deneyin!

Hala golf oynuyor.


meydan okuma: 30 bayt
ngn

@ngn mücadelesi kabul edildi
Uriel

Üzgünüm, aslında 30 karakter . Bilgi verme riski ile: karakterlerimden biri Klasik karakter kümesinde değil, bunu ilk başta fark etmedim.
ngn

@ngn Adám'ın karakter kümesini 30 bayt yapmak için kullanamaz mısınız ?
Probie

@Probie yep, ödül açıklaması "SBCS" ile demek istediğim
ngn

2

Clojure, 153 bayt

#(apply +(for[_(range 1e06):when(=(remove #{0}%)(reverse(sort(vals(frequencies(take(apply + %)(shuffle(for[i(range %2)j(range(count %))]j))))))))]1e-06))

Sadece bir kaba kuvvet simülasyon, daha hassas almak için yineleme sayısını ve sonunda buna göre "1 / N" değerini artırmak. İlk argüman sayımlardır ve 2. argüman ise takım başına destedeki kart sayısıdır.


2

J, 57 bayt

](#@]%~[:+/[-:"1[:\:~@(#/.~)"1+/@[{."1])i.@!@(*+/)A.(##\)

Çevrimiçi deneyin!

Bu O (golf) çalışır ve golfier olsaydı iyi olurdu (teorik olarak çalışır olsa da), test vakaların çoğunu boğulur. Ama onu düzeltmeye takılıp kaldım, özellikle tekrarlananlardan kaçınarak "1. Birisi yardım etmek isterse, işte ayrıştırılmış sürüm ...

Ana çatalın sağ tarafı destenin tüm olası fırsatlarıdır ve ana çatalın sol tarafı sadece orijinal sağ argüman yani eşleştiğimiz takım maskesi.

İçeride, her "karıştırılmış" desteden, ilk el elemanlarını alıyoruz , daha sonra anahtar kullanarak /.gruplayıp sonucu sıralıyoruz ve söz konusu takım maskesine uyup uymadığını kontrol ediyoruz . Eşleşen toplam sayıyı toplar ve bunu tüm olası destelerin uzunluğuna böleriz.

┌─┬─────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────┐
│]│┌───────┬─────┬─────────────────────────────────────────────────────────────────────────────────┐│┌──────────────────────┬──┬─────────┐│
│ ││┌─┬─┬─┐│┌─┬─┐│┌──┬─────┬──────────────────────────────────────────────────────────────────────┐│││┌────────┬─┬─────────┐│A.│┌─┬─────┐││
│ │││#│@│]│││%│~│││[:│┌─┬─┐│┌─┬────────┬─────────────────────────────────────────────────────────┐│││││┌──┬─┬─┐│@│┌─┬─────┐││  ││#│┌─┬─┐│││
│ ││└─┴─┴─┘│└─┴─┘││  ││+│/│││[│┌──┬─┬─┐│┌──┬───────────────────────────┬────────────────────────┐│││││││i.│@│!││ ││*│┌─┬─┐│││  ││ ││#│\││││
│ ││       │     ││  │└─┴─┘││ ││-:│"│1│││[:│┌─────────────────────┬─┬─┐│┌───────────┬────────┬─┐│││││││└──┴─┴─┘│ ││ ││+│/││││  ││ │└─┴─┘│││
│ ││       │     ││  │     ││ │└──┴─┴─┘││  ││┌──────┬─┬──────────┐│"│1│││┌─────┬─┬─┐│┌──┬─┬─┐│]││││││││        │ ││ │└─┴─┘│││  │└─┴─────┘││
│ ││       │     ││  │     ││ │        ││  │││┌──┬─┐│@│┌──────┬─┐││ │ ││││┌─┬─┐│@│[│││{.│"│1││ ││││││││        │ │└─┴─────┘││  │         ││
│ ││       │     ││  │     ││ │        ││  ││││\:│~││ ││┌─┬──┐│~│││ │ │││││+│/││ │ ││└──┴─┴─┘│ │││││││└────────┴─┴─────────┘│  │         ││
│ ││       │     ││  │     ││ │        ││  │││└──┴─┘│ │││#│/.││ │││ │ ││││└─┴─┘│ │ ││        │ ││││││└──────────────────────┴──┴─────────┘│
│ ││       │     ││  │     ││ │        ││  │││      │ ││└─┴──┘│ │││ │ │││└─────┴─┴─┘│        │ ││││││                                     │
│ ││       │     ││  │     ││ │        ││  │││      │ │└──────┴─┘││ │ ││└───────────┴────────┴─┘│││││                                     │
│ ││       │     ││  │     ││ │        ││  ││└──────┴─┴──────────┘│ │ ││                        │││││                                     │
│ ││       │     ││  │     ││ │        ││  │└─────────────────────┴─┴─┘│                        │││││                                     │
│ ││       │     ││  │     ││ │        │└──┴───────────────────────────┴────────────────────────┘││││                                     │
│ ││       │     ││  │     │└─┴────────┴─────────────────────────────────────────────────────────┘│││                                     │
│ ││       │     │└──┴─────┴──────────────────────────────────────────────────────────────────────┘││                                     │
│ │└───────┴─────┴─────────────────────────────────────────────────────────────────────────────────┘│                                     │
└─┴─────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────┘

1
Orlp'nin formülü APL için 42 puan aldı, belki de J'de 58'den az olurdu.
Uriel

1
Şu ana kadar 45 tane f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@] TIO
alıyorum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.