รูปแบบไพ่ในมือ


20

สำรับไพ่เป็นผลิตภัณฑ์ของคาร์ทีเซียนที่มีทั้ง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], พบน่าจะเป็นของมันที่เกิดขึ้น

การป้อนข้อมูล: จำนวนเต็มและอาร์เรย์RD

เอาท์พุท: ความน่าจะเป็นอย่างน้อย 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


เราสามารถสมมติได้ว่า D ถูกเรียงลำดับหรือไม่?
orlp

1
@orip ใช่ว่าเป็นสิ่งที่ฉันหมายโดย D [ผม] ≥D [i + 1]
NGN

การ์ดฉันรู้ว่าเริ่มต้นจาก 1 ไม่ใช่จาก 0 ...
RosLuP

@RosLuP คุณหมายถึงอะไร?
ngn

ฉันแน่ใจว่าฉันไม่เข้าใจบางสิ่งบางอย่าง ... หากการ์ดแสดงจากหมายเลข 1,2, ... , 13 ทั้งหมด * 4; ดังนั้นมันหมายความว่า "13 0 0 0" ในตัวอย่าง? 0 หมายถึงบัตร 0?
RosLuP

คำตอบ:


9

APL (Dyalog Unicode) 30 ตัวอักษร

×/!⍨,z,1÷((z←!∘≢⊢)⌸⊢),×∘≢!⍨1⊥⊢

ลองออนไลน์!

ใช้@ สูตร


ยอดเยี่ยมทำได้ดีมาก! ปุ่ม "+100" บอกว่าฉันจะต้องรออีก 10 ชั่วโมงก่อนที่ฉันจะได้รับรางวัล หลังจากนั้นฉันจะตั้งค่าใหม่สำหรับ +200
ngn

ใช่ฉันชนะ! ขอบคุณ @jayprich
FrownyFrog

@ FronyFrog คุณชอบ Dyalog APL อย่างไรเมื่อเทียบกับ J
Jonah

8

Python 3, 134 ไบต์

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)

สูตรเป็นผลิตภัณฑ์ของ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))แบ่งออกในที่สุด

หรือสัญกรณ์คณิตศาสตร์สมมติเมตรมี multiplicities ของnองค์ประกอบที่ไม่ซ้ำกันในD :

|D|!ม.1!ม.2!ม.n!(|D|RΣD)-1ΠdD(Rd)


2
ในช่วงเวลาสั้น ๆ ที่คุณทำให้ฉันเชื่อว่า PPCG ตอนนี้สนับสนุน LaTeX :)
ngn 20'17

การฝังสองฟังก์ชั่นที่ฉันได้รับ136แต่อาจจะสามารถเล่นกอล์ฟได้มากกว่านี้ (ใช้i=0เพื่อความหมายb()และใช้R,Dสำหรับn,k)
Jonathan Allan

7

R , 90 85 83 ไบต์

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))

ลองออนไลน์!

ฉันสังเกตสิ่งเดียวกันกับorlpแต่ฉันเลือกภาษาที่ดีที่มี combinatorics ในตัว

คำอธิบาย:

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)


คุณสามารถบันทึกอีกสองสามข้อด้วยสิ่งนี้: "<"=choose(นอกฟังก์ชั่น) และอาจใช้ seqขึ้นอยู่กับคำตอบของ ngn ต่อความคิดเห็นที่ฉันโพสต์เมื่อเช้านี้
JayCe

6

เยลลี่ ,  22  20 ไบต์

-2 ไบต์โดยใช้ quick ใหม่ʋและ atom แบบ monadic ใหม่

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

ลิงก์ dyadic รับการแจกแจงการแจกแจง D ทางซ้ายและจำนวนตำแหน่ง R ขวาทางขวาซึ่งจะส่งกลับความน่าจะเป็นของการเกิดขึ้น

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

ĠẈ!;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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

 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 ไบต์

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

ลองที่นี่! หรือตรวจสอบกรณีทดสอบทั้งหมด!

มันทำงานอย่างไร

cc *.! lQ * F.cLvzQ * F.! hMr8Q.c * vzlQs ~ โปรแกรมเต็มรูปแบบ D = list, R = number

   .! ~ ปัจจัยแห่ง ...
     lQ ~ ความยาวของ D.
  * ~ คูณด้วย ...
       * F ~ ผลิตภัณฑ์ขององค์ประกอบของ ...
         .c ~ nCr ระหว่าง ...
           LQ ~ แต่ละองค์ประกอบของ D และ ...
            vz ~ R.
 c ~ หารด้วย ...
               * F ~ ผลิตภัณฑ์ขององค์ประกอบของ ...
                 .! ~ ปัจจัยของแต่ละคน ...
                   hM ~ หัว จำนวนองค์ประกอบที่อยู่ติดกันใน ...
                     r8Q ~ การเข้ารหัสความยาวของ D
c ~ หารด้วย ...
                        .c ~ nCr ระหว่าง ...
                          * ~ ผลิตภัณฑ์ของ ...
                           vz ~ R และ ...
                             lQ ~ ความยาวของ D.
                               s ~ และผลรวมของ D
                                 ~ เอาท์พุทโดยปริยาย

3

APL (Dyalog) 42 ไบต์

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

ลองออนไลน์!

ยังคงเล่นกอล์ฟ


การท้าทาย: 30 ไบต์
ngn

ยอมรับความท้าทาย @ngn
Uriel

ขออภัยก็จริง 30 ตัวอักษร ด้วยความเสี่ยงที่จะให้ข้อมูล: หนึ่งในตัวอักษรของฉันไม่ได้อยู่ในชุดอักขระแบบคลาสสิกฉันไม่ทราบว่าในตอนแรก
ngn

@ngn คุณไม่เพียงแค่ใช้ชุดอักขระของAdámเพื่อทำให้มีขนาด 30 ไบต์?
Probie

@Probie yep นั่นคือสิ่งที่ฉันหมายถึง "SBCS" ในคำอธิบายความโปรดปราน
ngn

2

Clojure 153 ไบต์

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

เพียงแค่การจำลองแบบเดรัจฉานเพื่อให้ได้ความแม่นยำมากขึ้นจะเพิ่มจำนวนการวนซ้ำและค่า "1 / N" ในตอนท้าย อาร์กิวเมนต์แรกคือการนับและอาร์กิวเมนต์ที่ 2 คือจำนวนไพ่ในสำรับต่อชุด


2

J, 57 ไบต์

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

ลองออนไลน์!

สิ่งนี้จะทำงานในO (กอล์ฟ)และจะทำให้หายใจไม่ออกในหลาย ๆ กรณีทดสอบ (แม้ว่าจะใช้งานได้ในทางทฤษฎี) ซึ่งน่าจะดีถ้ามันเป็นนักกอล์ฟ "1แต่ฉันติดอยู่ในการตัดแต่งมันลงโดยเฉพาะอย่างยิ่งกับผู้ที่หลีกเลี่ยงการทำซ้ำ หากใครต้องการความช่วยเหลือนี่เป็นเวอร์ชั่นที่แยกวิเคราะห์ ...

ทางด้านขวาของทางแยกหลักคือข้อตกลงที่เป็นไปได้ทั้งหมดของดาดฟ้าและทางด้านซ้ายของทางแยกหลักเป็นเพียง ARG ขวาเดิมคือหน้ากากชุดที่เรากำลังจับคู่กับ

ข้างในจากสำรับ "สับ" แต่ละอันเรารับองค์ประกอบมือแรกจากนั้นจัดกลุ่มพวกเขาโดยใช้กุญแจ/.และเรียงลำดับผลลัพธ์และตรวจสอบว่าตรงกับหน้ากากสูทที่มีปัญหาหรือไม่ เราเพิ่มจำนวนรวมของการแข่งขันและหารด้วยความยาวของเด็คที่เป็นไปได้ทั้งหมด

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

1
สูตรของ Orlp ได้คะแนน 42 สำหรับ APL ซึ่งอาจจะน้อยกว่า 58 ใน J หรือไม่?
Uriel

1
ฉันได้มาถึง 45 ทางf=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@] TIO
jayprich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.