Mẫu tay trong một trò chơi bài


20

Một bộ bài là sản phẩm của Cartesian về Sbộ quần áo và Rcấp bậc. Nhiều, mặc dù không phải tất cả, trò chơi thẻ sử dụng S=4R∊{6,8,13}. Một tay Hbài được xử lý từ bộ bài. Phân phối của nó , còn gọi là "mẫu tay", là một mảng mô tả số lượng thẻ bạn nhận được từ mỗi bộ đồ, bỏ qua thứ tự phù hợp (vì vậy, nó giống như một bộ nhiều bộ). Cho một phân phối Dđáp ứng len(D)=S, 1≤sum(D)=H≤S×R, 0≤D[i]≤R, D[i]≥D[i+1], tìm xác suất xảy ra của nó.

Đầu vào: một số nguyên Rvà một mảng D.

Đầu ra: xác suất có ít nhất 5 chữ số sau dấu thập phân; số 0 có thể được bỏ qua; ký hiệu khoa học là ok.

Lỗ hổng bị cấm. Chiến thắng ngắn nhất.

Các xét nghiệm:

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

Xem thêm Mô hình tay cầu trong Wikipedia .

EDIT: bỏ các hạn chế không cần thiết H≤R

EDIT: thêm ràng buộc H≥1


Chúng ta có thể giả sử rằng D được sắp xếp?
orlp

1
@orip vâng, đó là những gì tôi muốn nói với D [i] D [i + 1]
ngn

Thẻ tôi biết bắt đầu từ 1 không phải từ 0 ...
RosLuP

@RosLuP Ý bạn là gì?
ngn

Tôi chắc chắn mình đã không hiểu điều gì đó ... Nếu Thẻ được đại diện từ số 1,2, ..., 13 tất cả * 4; vậy ví dụ "13 0 0 0" nghĩa là gì? 0 có nghĩa là thẻ 0?
RosLuP

Câu trả lời:


9

APL (Dyalog Unicode) , 30 ký tự

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

Hãy thử trực tuyến!

Sử dụng công thức của @ orlp .


Tuyệt vời, làm tốt lắm! Nút "+100" nói rằng tôi phải đợi thêm 10 giờ nữa trước khi tôi có thể thưởng tiền thưởng. Sau đó tôi sẽ thiết lập một cái khác cho +200.
ngn

Yay tôi thắng! cảm ơn @jayprich
FrownyFrog

@FrownyFrog Bạn thích Dyalog APL như thế nào so với J?
Giô-na

8

Python 3, 134 byte

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)

Công thức là sản phẩm của binom(R, d)từng phần tử dtheo Dthời gian factorial(len(D)), được chia cho sản phẩm của factorial(len(S))từng phần tử Strong các nhóm của D(ví dụ: [4, 4, 3, 2]có các nhóm [[4, 4], [3], [2]]), cuối cùng được chia cho binom(len(D) * R, sum(D)).

Hoặc trong ký hiệu toán học, giả sử m chứa bội số của n phần tử duy nhất trong D :

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


2
trong một khoảnh khắc ngắn ngủi, bạn đã khiến tôi tin rằng PPCG hiện hỗ trợ LaTeX :)
ngn

Nội tuyến hai chức năng tôi nhận được 136 nhưng có lẽ điều đó có thể được đánh gôn nhiều hơn (sử dụng i=0cho ý nghĩa b()và sử dụng R,Dcho n,k).
Jonathan Allan

7

R , 90 85 83 byte

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

Hãy thử trực tuyến!

Tôi đã quan sát điều tương tự như orlp , nhưng tôi đã chọn một ngôn ngữ hay có tích hợp tổ hợp.

Giải trình:

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)


Bạn có thể tiết kiệm thêm một chút với điều này: "<"=choose(bên ngoài chức năng) và có khả năng sử dụng seq tùy thuộc vào câu trả lời của ngn cho nhận xét tôi đã đăng sáng nay.
JayCe

6

Thạch ,  22  20 byte

-2 byte sử dụng một ʋnguyên tử mới nhanh và một nguyên tử đơn nguyên mới

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

Một liên kết dyadic, lấy phân phối thỏa thuận, D, bên trái và số thứ hạng, R, bên phải, trả về xác suất xảy ra.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

ĠẈ!;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 byte

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

Hãy thử trực tuyến!

Giải trình

 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

Bình thường , 32 byte

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

Hãy thử nó ở đây! hoặc Xác minh tất cả các trường hợp thử nghiệm!

Làm thế nào điều này hoạt động?

cc *.! lQ * F.cLvzQ * F.! hMr8Q.c * vzlQs ~ Chương trình đầy đủ. D = danh sách, R = số.

   .! ~ Giai thừa của ...
     lQ ~ Độ dài của D.
  * ~ Nhân với ...
       * F ~ Sản phẩm của các yếu tố của ...
         .c ~ Các nCr giữa ...
           LQ ~ Mỗi yếu tố của D, và ...
            vz ~ R.
 c ~ Chia cho ...
               * F ~ Sản phẩm của các yếu tố của ...
                 .! ~ Giai thừa của mỗi ...
                   hM ~ Thủ trưởng. Đếm các yếu tố liền kề trong ...
                     r8Q ~ Mã hóa chiều dài chạy của D.
c ~ Chia cho ...
                        .c ~ Các nCr giữa ...
                          * ~ Sản phẩm của ...
                           vz ~ R, và ...
                             lQ ~ Độ dài của D.
                               s ~ Và tổng của D.
                                 ~ Đầu ra ngầm.

3

APL (Dyalog) , 42 byte

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

Hãy thử trực tuyến!

Vẫn chơi golf.


thử thách: 30 byte
ngn

@ngn thách thức được chấp nhận
Uriel

Xin lỗi, nó thực sự là 30 ký tự . Với nguy cơ cho đi thông tin: một trong những ký tự của tôi không có trong bảng mã Cổ điển, ban đầu tôi không nhận ra điều đó.
ngn

@ngn Bạn không thể sử dụng bộ ký tự của Adám để tạo thành 30 byte?
Probie

@Probie yep, đó là những gì tôi muốn nói về "SBCS" trong phần mô tả tiền thưởng
ngn

2

Clojure, 153 byte

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

Chỉ cần một mô phỏng vũ lực, để có độ chính xác cao hơn, hãy tăng số lần lặp và giá trị "1 / N" ở cuối. Đối số đầu tiên là số lượng và đối số thứ hai là số lượng thẻ trong bộ bài trên mỗi bộ.


2

J, 57 byte

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

Hãy thử trực tuyến!

Điều này chạy trong O (golf) và sẽ bóp nghẹt nhiều trường hợp thử nghiệm (mặc dù hoạt động trên lý thuyết), sẽ ổn nếu nó là golfer. Nhưng tôi bị mắc kẹt trong việc cắt giảm nó, đặc biệt là tránh những điều đó lặp đi lặp lại "1. Nếu bất cứ ai muốn giúp đỡ, đây là phiên bản được phân tích cú pháp ...

Phía bên phải của ngã ba chính là tất cả các giao dịch có thể có của bộ bài , và phía bên trái của ngã ba chính chỉ là đối số bên phải ban đầu, tức là mặt nạ phù hợp mà chúng ta đang đối đầu.

Bên trong, từ mỗi boong "xáo trộn", chúng ta hãy là người đầu tiên tay yếu tố, sau đó nhóm chúng sử dụng khóa /.và sắp xếp kết quả, và kiểm tra xem có phù hợp với mặt nạ phù hợp trong câu hỏi. Chúng tôi thêm cộng tổng số phù hợp và chia số đó thành chiều dài của tất cả các sàn có thể.

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

1
Công thức của Mitchp đạt 42 điểm cho APL, có lẽ điều đó sẽ ghi ít hơn 58 trên J?
Uriel

1
Tôi nhận được 45 cho đến nay theo cách f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@] TIO
jayprich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.