Ручні візерунки в картковій грі


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 цифр після десяткової позначки; останні нулі можуть бути пропущені; наукове позначення нормально.

Лазівки заборонені. Найкоротші виграші.

Тести:

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

Дивіться також схеми мостових рук у Вікіпедії .

EDIT: скасовано зайве обмеження H≤R

EDIT: додано обмеження H≥1


Чи можна вважати, що D відсортовано?
orlp

1
@orip так, саме це я мав на увазі під D [i] ≥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⊥⊢

Спробуйте в Інтернеті!

Використання @ формули orlp в .


Чудово, молодець! Кнопка «+100» говорить про те, що я повинен почекати ще 10 годин, перш ніж зможу присвоїти нагороду. Після цього я встановив ще один на +200.
ngn

Так, я перемагаю! дякую @jayprich
FrownyFrog

@FrownyFrog Як вам подобається Dyalog APL порівняно з J?
Йона

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)для кожного елемента dв Dрази factorial(len(D)), поділений на добуток factorial(len(S))для кожного Sз угруповань D(наприклад, [4, 4, 3, 2]має групування [[4, 4], [3], [2]]), нарешті розділений на binom(len(D) * R, sum(D)).

Або в математичному позначенні, якщо припустимо, що m містить кратність n унікальних елементів у D :

|D|!м1!м2!мн!(|D|RD)-1гD(Rг)


2
на короткий момент ви змусили мене повірити, що PPCG тепер підтримує LaTeX :)
1717 року

Включивши дві функції, я отримав 136, але, можливо, це може бути більше гольфу ( i=0означає, що означає b()і використовує R,Dдля n,k).
Джонатан Аллан

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(поза функцією) та потенційно використовувати seq залежно від відповіді ngn на коментар, який я опублікував сьогодні вранці.
JayCe

6

Желе ,  22  20 байт

-2 байти, використовуючи новий швидкий ʋ, і новий монадичний атом

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

Діадичне посилання, що приймає розподілену угоду, 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 = список, R = число.

   .! ~ Фабрика ...
     lQ ~ Довжина D.
  * ~ Помножено на ...
       * F ~ Добуток елементів ...
         .c ~ nCr між ...
           LQ ~ Кожен елемент D, і ...
            вз ~ Р.
 c ~ Розділено на ...
               * F ~ Добуток елементів ...
                 .! ~ Фабрика кожного ...
                   hM ~ Голови. Кількість суміжних елементів у ...
                     r8Q ~ Кодування довжини пробігу D.
c ~ Розділено на ...
                        .c ~ nCr між ...
                          * ~ Продукт ...
                           vz ~ R, і ...
                             lQ ~ Довжина D.
                               s ~ І сума D.
                                 ~ Висновок неявно.

3

APL (Dyalog) , 42 байти

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

Спробуйте в Інтернеті!

Ще гольф.


виклик: 30 байт
пн.

@ngn прийнятий виклик
Уріель

Вибачте, це насправді 30 символів . Із ризиком передавати інформацію: одна з моїх символів не в класичній шафі, я спочатку не усвідомлював цього.
ngn

@ngn Не можете ви просто використати набір символів Адама, щоб зробити його 30 байтами?
Пробі

@Probie так, ось що я мав на увазі під "SBCS" в описі щедрості
1818

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

J, 57 байт

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

Спробуйте в Інтернеті!

Це працює в O (гольф) і задихнеться у багатьох тестових випадках (хоча працює теоретично), що було б чудово, якби це був гольфіст. Але я застряг у підстриганні, особливо, уникаючи повторень "1. Якщо хтось хоче допомогти, ось проаналізована версія ...

Права сторона основної вилки - це всі можливі пропозиції колода , а ліва частина основної вилки - це лише оригінальний правий аргумент, тобто маска костюма, проти якої ми співставляємось.

Всередині, з кожної «перетасованої» колоди, ми беремо елементи з перших рук , потім групуємо їх за допомогою клавіш /.і сортуємо результат, і перевіряємо, чи відповідає маска, про яку йдеться. Ми додаємо загальне число, яке відповідає, і ділимо його на довжину всіх можливих колод.

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

1
Формула Орлпа набрала 42 за APL, можливо, це набрало б менше 58 на J?
Уріель

1
Я отримую 45 так далеко f=:(([:!#)%[:*/[:!#/.~)@]**/@(]![)%+/@]![*#@] TIO
jayprich
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.