Kart çifti olasılığı


9

Toplam N * M kart için tamsayı değeri [ 1 , M ] olan N kart kopyasından oluşan bir deste verildiğinde , 1 değerine sahip bir kartın 2 değerine sahip bir karta bitişik olma olasılığını hesaplayın .

Çözümünüz kesin veya yaklaşık olabilir ve aynı girdiler verildiğinde her çalışma için aynı olması gerekmez. Verilen cevap, gerçek çözümün +/-% 5'i içinde olmalıdır (RNG'nin sizin lehinize olmadığı şansı çok nadirdir). Programınız, makul bir süre içinde yanıtı vermelidir (örneğin, hangi donanıma sahip olursanız olun 10 dakikadan az). M ve N'nin makul küçük olduğunu ve hata kontrolüne gerek olmadığını varsayabilirsiniz .

Deste periyodik değildir , bu nedenle ilk kart 1 ve son kart 2 ise , bu bitişiklik gereksinimlerini karşılamaz.

Bir test durumu olarak, N = 4 ve M = 13 (standart 52 kartlı deste) için beklenen çözelti ~% 48.6'dır.

Rastgele karıştırmalar kullanarak Python + NumPy'de golf edilmeyen bir örnek:

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

Çıkış uygun bulduğunuz herhangi bir biçimde olabilir (işlev dönüş değeri, terminal çıkışı, dosya vb.) Ve girdi uygun bulduğunuz herhangi bir biçimde olabilir (işlev parametresi, terminal girişi, komut satırı arg, vb.)

Standart halka delikleri geçerlidir.

Bu kod golf, en kısa kod (bayt cinsinden) kazanır.

Liderler Sıralaması


1
saran bitişiklik aldatıcı karmaşık bir bükülme
Sparr

@Sparr Bana bir fikir verdin! :-)
Luis Mendo

Yanıtlar:


2

Pyth, 23 22 bayt

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

10000 yineleme çalıştırır. Sayı bayt maliyeti olmadan değiştirilebilir. Girdi yeni satırla ayrılmıştır. Bilgisayarımda yaklaşık 9 saniye sürüyor.

gösteri

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 bayt

Bu , dilden daha önceki sürüm 3.1.0 sürümünü kullanır .

Hesaplama 1000 rastgele gerçekleşme çizen bir döngü ile yapılır. Çalışması birkaç saniye sürer. Vektörize bir şekilde daha hızlı yapılabilir. Girdi biçimindedir [N M].

Eski sürüm : rastgele bir kart destesi oluşturur ve iki kez kontrol eder: önce ileri sonra geri.

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

Yeni sürüm : rastgele bir kart destesi oluşturur ve daha sonra 0aralarında ters çevrilmiş bir sürümünü ekler . Bu şekilde kontrol sadece bir kez ileri yönde yapılabilir. Bu iki bayt tasarrufu sağlar.

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

Misal

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

açıklama

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 bayt

JE?>J1-1^-1c2JQZ

Gösteri.

Bu aşağıdaki

  • eğitimli bir tahminde bulunmak,
  • yeterince yakın olup olmadığını kontrol et,
  • tekrar et

programlama stratejisi. Bu durumda kazanan eğitimli tahmin

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

kabaca Nkovalara düşme şansı olduğunu ve geçerli kovaların bir kısmının olduğunu söyler 2 / M. Yuva olan kovalar 0s'nin yanına yerleştirilir ve olasılıklar 1s'dir.

Hata asla% 3'ün (şaşırtıcı bir şekilde) üzerine çıkmıyor ve parametreler büyüdükçe (beklediğim gibi)% 0'a yaklaşıyor gibi görünüyor.

Girdi yeni satırla ayrılmıştır.

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

Açıkça anlaşılan gerçeği kabul ederseniz bir karakteri kaydedebilir False == 0ve JE&>J1-1^-1c2JQbunun yerine yapabilirsiniz.


Bu benim Pyth (ilk cevap) benim ilk gidiş olur, bu yüzden eleştiri ve yardım özellikle açığız.
Veedrac

1

MATL , 44 38 bayt

Bu aynı zamanda bu meydan okumadan daha erken olan MATL 3.1.0 sürümünü kullanır .

4 bayt tasarruf için Luis Mendo sayesinde yeni sürüm!

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

Eski sürüm (44 bayt):

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

açıklama

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

Örneğin,

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

Not (21/5/16): MATL 18.0.0 sürümünden X+itibaren kaldırılmıştır, ancak Y+yerinde kullanılabilir. MATL 3.1.0'dan 18.0.0'a yapılan değişiklikler, bu cevabın artık sadece 31 bayt olarak yazılabileceği anlamına geliyor *xO1e4:"2:Gtb*Z@w\TT2&Y+1=ah]Ym.


Zaten bir MATL cevabı olduğunu biliyorum, ama yöntemlerin oldukça farklı olduğunu düşünüyorum, bu yüzden hala bunu gönderdim.
David

Evrişimi seviyorum!
Luis Mendo

Biraz değiştirerek kaydedebilirsiniz [1 1]içine TTo. Ayrıca, virgül gerekmez
Luis Mendo

@LuisMendo teşekkürler! Bunu yapmanın daha iyi bir yolu olması gerektiğini düşündüm!
David

Şimdi evrişimin nasıl çalıştığını görüyorum. Kartların 0 tabanlı isimlendirilmesi çok zekiydi!
Luis Mendo

0

Mathematica, 93 92 91 bayt

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

Hala kapalı bir form arıyorum ...


iç içe geçmiş bir permütasyon hesaplamaları içerecektir.
Sparr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.