카드 페어 확률


9

구성된 덱 주어 N의 정수 값을 갖는 카드의 사본 [ 1 , M은 ] 총 N * M의 카드의 가치 카드 확률을 계산하는 1 의 값을 가진 카드에 인접한 2 .

귀하의 솔루션은 정확하거나 근사치 일 수 있으며 동일한 입력이 주어질 때마다 모든 실행에 대해 동일 할 필요는 없습니다. 주어진 답변은 실제 솔루션의 +/- 5 % 내에 있어야합니다 (RNG가 귀하에게 유리하지 않은 경우는 드 rare니다). 귀하의 프로그램은 합리적인 시간 내에 답변을 제공해야합니다 (예 : 하드웨어에 상관없이 10 분 미만). MN 이 작고 오류 검사가 필요하지 않다고 가정 할 수 있습니다 .

데크는 주기적 이지 않으므로 첫 번째 카드가 1 이고 마지막 카드가 2 인 경우 인접 요구 사항을 충족하지 않습니다.

테스트 사례로서 N = 4M = 13 (표준 52 카드 데크)의 경우 예상 솔루션은 ~ 48.6 %입니다.

다음은 무작위 셔플을 사용하여 Python + NumPy에서 골프화되지 않은 구현의 예입니다.

from __future__ import division
from numpy import *

def adjacent(N, M):
    deck = array([i for i in range(1, M+1)]*N)
    trials = 100000
    count = 0
    for i in range(trials):
        random.shuffle(deck)
        ores = (deck == 1)
        tres = (deck == 2)
        if(any(logical_and(ores[1:], tres[:-1])) or
           any(logical_and(ores[:-1], tres[1:]))):
            count += 1
    return count/trials

출력은 편리한 형태 (함수 리턴 값, 터미널 출력, 파일 등) 일 수 있으며 입력은 편리한 형태 (함수 매개 변수, 터미널 입력, 명령 행 인수 등) 일 수 있습니다.

표준 루프 홀이 적용됩니다.

이것은 가장 짧은 코드 (바이트)가이기는 코드 골프입니다.

리더 보드


1
인접 주변에 배치하지 않으면 현혹 복잡 트위스트
Sparr

@Sparr 당신은 나에게 아이디어를 주었다! :-)
Luis Mendo

답변:


2

Pyth, 23 22 바이트

csm}1sM.:.S*vzUQ2J^T4J

10000 반복을 실행합니다. 바이트 비용없이 숫자를 변경할 수 있습니다. 입력은 줄 바꿈으로 구분됩니다. 컴퓨터에서 약 9 초가 걸립니다.

데모

csm}1sM.:.S*vzUQ2J^T4J
                 J^T4     J = 10000
  m              J        Do the following J times.
           *vzUQ          Set up the deck. (0 .. n-1, repeated m times.)
         .S               Shuffle the deck.
       .:       2         Find all 2 elment substrings.
     sM                   Add them up.
   }1                     Check if any pairs add to 1 ([0, 1] or [1, 0])
 s                        Add up the results (True = 1, False = 0)
c                     J   Divide by J.

2

MATL , 44 46 바이트

이 문제보다 빠른 언어 3.1.0 릴리스가 사용 됩니다.

계산은 1000 개의 랜덤 실현을 그리는 루프로 수행됩니다. 실행하는 데 몇 초가 걸립니다. 벡터화 된 방식으로 더 빠르게 수행 할 수 있습니다. 입력 형식은입니다 [N M].

Old version : 무작위로 덱을 생성하고 두 번 확인합니다 : 먼저 앞면과 뒷면.

itpw1)1e3:"2$twZ@w/Y]t1HhXfnwH1hXfn|bb]xxN$hYm

새 버전 : 임의의 카드 덱을 생성하고 뒤집힌 버전을 0사이에 추가합니다. 이런 식으로 점검은 순방향으로 한 번만 수행 할 수 있습니다. 이것은 2 바이트를 절약합니다.

itpw1)1e3:"2$twZ@w/Y]tP0whh1HhXfngbb]xxN$hYm

>> matl itpw1)1e3:"2$twZ@w/Y]tP0whh1HhXfngbb]xxN$hYm
> [4 13]
0.469

설명

i                 % input: [N M]
tpw1)             % produce N*M and N
1e3:"             % repeat 1000 times
  2$twZ@w/Y]      % produce random deck of cards from 1 to N*M
  tP0whh          % append 0 and then flipped version of deck
  1Hh             % vector [1 2]
  Xf              % find one string/vector within another                          
  ng              % was it found at least once?
  bb              % bubble up element in stack, twice                     
]                 % end                                                     
xx                % delete top of the stack, twice
N$h               % vector with all elements in stack
Ym                % mean value


1

Pyth, 16 바이트

JE?>J1-1^-1c2JQZ

데모.

이것은 다음과 같습니다

  • 교육받은 추측을하고
  • 충분히 가까이 있는지 확인하고
  • 반복

프로그래밍 전략. 이 경우 승리 한 교육 추측은

1 - (1 - 2 / M) ** N

대략 N버킷에 빠질 가능성 이 있으며 유효한 버킷의 비율은입니다 2 / M. 버킷은 슬롯 옆에 0있고 기회는 1s입니다.

오류는 (놀랍게도) 3 %를 넘지 않는 것으로 보이며 매개 변수가 커짐에 따라 0 %로 수렴하는 것처럼 보입니다 (예상 한 것처럼).

입력은 줄 바꿈으로 구분됩니다.

              Q  Q = eval(input())
JE               J = eval(input())
  ?>J1           if J > 1
      -1^-1c2JQ  then 1 - (1 - 2 / J) ** Q
               Z else 0

당신이 그 노골적으로 명백한 사실을 받아 들인다면 당신은 문자를 저장할 수 있습니다 False == 0, 그리고 할 JE&>J1-1^-1c2JQ대신.


이것은 Pyth (및 첫 번째 답변)에서 처음 갔으므로 비판과 도움은 특히 환영합니다.
Veedrac

1

MATL , 44 38 바이트

이것은 또한 MATL 버전 3.1.0을 사용하는데 , 이는이 도전보다 빠릅니다 .

4 바이트를 절약 한 Luis Mendo 덕분에 새 버전!

iiXI*XJxO1e4XH:"JZ@I\TTo3X53$X+1=a+]H/

이전 버전 (44 바이트) :

OiitXIx*XJx1e4XH:"JJZrI\[1 1]3X5,3$X+1=a+]H/

설명

i               % take input for N
i               % take input for M
XI              % save M into clipboard I
*XJ             % multiply N and M and store in clipboard J
x               % clear the stack
O               % make a zero to initialise count of pairs
1e4XH:"         % 1e4=10000, XH saves into clipboard H, : makes the vector 1:1e4
                % which is used to index a for loop, started using "
    JZ@         % Use randperm to generate a random permutation of the vector 1:N*M
    I\          % take the result mod M, now each card has a value one less than before
    TTo3X53$X+  % convolve vector of card values with [1 1] to do pairwise summation
    1=a         % find if any sums equal 1, which means there is a [0 1] or [1 0]         
    +           % add the logical value to the count of pairs
]
H/              % divide the count by the number of deals to get the probability

예를 들어

>> matl 'iiXI*XJxO1e4XH:"JZ@I\TTo3X53$X+1=a+]H/'
> 4
> 13
0.4861

참고 (21/5/16) : MATL 릴리스 18.0.0 X+부터 제거되었지만 Y+대신 사용할 수 있습니다. MATL 버전 3.1.0에서 18.0.0으로의 변경은 이제이 답변을 단지 31 바이트로 작성할 수 있음을 의미합니다 *xO1e4:"2:Gtb*Z@w\TT2&Y+1=ah]Ym.


이미 MATL 답변이 있음을 알고 있지만 방법이 상당히 다르므로 여전히이 방법을 게시했습니다.
David

나는 회선을 좋아한다!
Luis Mendo

에 약간의 변경 사항 [1 1]을 저장할 수 있습니다 TTo. 또한 쉼표가 필요하지 않습니다
Luis Mendo

@LuisMendo 감사합니다! 나는 그것을하는 더 좋은 방법이 있어야한다고 생각했습니다!
David

이제 컨볼 루션이 어떻게 작동하는지 봅니다. 0부터 시작하는 카드 이름 지정은 매우 영리했습니다!
Luis Mendo

0

수학, 93 92 91 바이트

N@Count[RandomSample@Flatten[Range@#~Table~{#2}]~Table~{a=1*^5},{b=___,1,2,b}|{b,2,1,b}]/a&

여전히 닫힌 양식을 찾고 있습니다 ...


순열 계산의 중첩 루프가 포함됩니다.
Sparr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.