카드 게임에서 손 패턴


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], 그것은 발생의 가능성을 찾을 수 있습니다.

입력 : 정수 R및 배열 D.

출력 : 소수점 이하 5 자리 이상의 확률; 후행 0은 건너 뛸 수 있습니다. 과학적 표기법은 괜찮습니다.

허점은 금지되어 있습니다. 최단 승리.

테스트 :

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

Wikipedia의 Bridge hand patterns 도 참조하십시오 .

편집 : 불필요한 제한을 삭제 H≤R

편집 : 제약 추가 H≥1


D가 정렬되었다고 가정 할 수 있습니까?
orlp

1
@orip 네, 그게 제가 의미 한 바는 D [i] ≥D [i + 1]
ngn

내가 아는 카드는 0이 아닌 1부터 시작합니다 ...
RosLuP

@RosLuP 무슨 뜻인가요?
ngn

나는 내가 무언가를 이해하지 못했다고 확신한다. 만약 카드가 1,2, ..., 13으로 표현된다면 모두 * 4; 예를 들어 "13 0 0 0"은 무엇을 의미합니까? 0은 카드 0을 의미합니까?
RosLuP

답변:


9

APL (Dyalog Unicode) , 30 자

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

온라인으로 사용해보십시오!

사용 orlp의 공식 @ .


훌륭합니다! "+100"버튼은 현상금을 수여하기 전에 10 시간을 더 기다려야한다고 말합니다. 그런 다음 +200을 위해 다른 것을 설정하겠습니다.
ngn

그래, 내가 이겼어! 감사합니다 @jayprich
FrownyFrog

@FrownyFrog J와 비교 한 Dyalog APL은 어떻습니까?
요나

8

파이썬 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)각 요소 dDfactorial(len(D))의 곱으로 나누어, factorial(len(S))각각 S의 그룹에서 D(예 [4, 4, 3, 2]그룹을 갖는다 [[4, 4], [3], [2]]), 마지막으로 나눈 binom(len(D) * R, sum(D)).

또는 수학 표기법에서 mD 에있는 n 개의 고유 한 요소 의 다중성을 포함 한다고 가정합니다 .

|D|!m1!m2!mn!(|D|RD)1dD(Rd)


2
잠깐 동안 PPCG가 LaTeX를 지원한다고 생각하게하셨습니다. :)
ngn

두 함수 인라인 내가 가지고 136을 하지만 어쩌면 그 이상 (사용이 golfed 할 수 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 와 같은 것을 관찰 했지만 조합론이 내장 된 멋진 언어를 골랐습니다.

설명:

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기능 으로 몇 가지를 더 저장할 수 있습니다 (함수 제외) . 오늘 아침에 게시 한 주석에 대한 ngn의 답변에 따라 seq를 잠재적으로 사용할있습니다 .
JayCe

6

젤리 ,  22  20 바이트

새로운 quick ʋ및 새로운 모나 딕 원자를 사용하는 -2 바이트

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

왼쪽의 거래 분포 D와 오른쪽의 순위 수 R을 사용하는 2 진 링크는 발생 확률을 리턴합니다.

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오

방법?

ĠẈ!;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 = 목록, R = 숫자

   .! ~의 계승 ...
     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 bytes
ngn

@ngn 챌린지 허용
Uriel

죄송합니다 . 실제로 30 입니다. 정보를 줄 위험이 있습니다. 내 문자 중 하나가 클래식 문자 세트에 없기 때문에 처음에는 그것을 알지 못했습니다.
ngn

@ngn Adám의 문자 집합 을 사용하여 30 바이트로 만들 수는 없습니까?
Probie

@Probie yep, 이것이 현상금 설명에서 "SBCS"의 의미입니다
ngn

2

클로저, 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

J, 57 바이트

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

온라인으로 사용해보십시오!

이것은 O (golf) 에서 실행되며 많은 테스트 사례에서 이론적으로 작동하지만 골퍼라면 괜찮을 것입니다. 그러나 나는 특히 반복되는 것들을 피하면서 그것을 다듬어 버렸습니다 "1. 누구든지 도와주고 싶다면 파싱 된 버전이 있습니다 ...

메인 포크의 오른쪽은 데크 의 모든 가능한 거래이며 메인 포크 의 왼쪽은 원래의 오른쪽 arg입니다. 즉, 일치하는 양복 마스크입니다.

내부는 각각 "셔플"갑판에서, 우리는 첫 번째 걸릴 다음 그룹화 키를 사용하여 요소 /.및 정렬 결과를, 그 문제의 정장 마스크와 일치하는지 확인. 일치하는 총 수를 합산하고 가능한 모든 데크의 길이로 나눕니다.

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

1
Orlp의 공식은 APL에서 42 점을 얻었습니다. J에서 58 점 미만일까요?
우리엘

1
나는 지금까지 45를 얻는다. f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@] TIO
jayprich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.