Bozuk para kadar yarım kafa alma olasılığını hesaplayın.


10

Standart girdiden küçük bir pozitif tamsayı verildiğinde, bir çok bozuk paranın çevirme olasılığının yarı kafa ile sonuçlanma olasılığını hesaplayan bir program yazın.

Örneğin, 2 jeton verildiğinde olası sonuçlar şunlardır:

HH HT TH TT

burada H ve T baş ve kuyruktur. Sikke sayısının yarısı kadar kafa olan 2 sonuç ( HTve TH) vardır. Toplam 4 sonuç vardır, bu nedenle olasılık 2/4 = 0.5'dir.

Bu göründüğünden daha basit.

Test senaryoları:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375

1
Madeni paraların mükemmel olduğunu ve kafa veya kuyruk alma şansı olduğunu varsayabiliriz?
Juan

Çıkışı stdout'a yazdırmamız gerekiyor mu?
Dogbert

@Juan evet. @ Köpek evet.
david4dev

Çözümlerimizi doğrulamak için biraz daha test durumu alabilir miyiz?
Dogbert

@Dogbert - done
david4dev

Yanıtlar:


3

J, 22 19 (katil yaklaşım)

Haskell cevabımı golf yaparken buna düştüm.

%/@:>:@i.&.(".@stdin)_

( diğer J cevabımla aynı G / Ç )


Bu benim için bir hata veriyor:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ouch. Artık komut dosyası da çalışmadı. Nerede dağınık olduğumu hatırlamıyorum, ancak test ettiğiniz sürüm gerçekten hatalı. Şimdi düzeltildi.
JB

3

Pari / GP - 32 30 34 karakter

print(binomial(n=input(),n\2)/2^n)

Vay, yerleşik bir binom fonksiyonuna sahip bir programlama dili düşünmedim.
david4dev

32 karakterler: print(binomial(n=input,n\2)/2^n).
Charles

3

Python 53 Karakterleri

i=r=1.;exec"r*=(2*i-1)/i/2;i+=1;"*(input()/2);print r

3

Excel, 25

Yine de spec göre değil :)

Bir hücreyi adlandırın nve ardından başka bir hücreye aşağıdakileri yazın:

=COMBIN(n,n/2)/POWER(2,n)

2
Excel aslında ^ 'yi düzgün şekilde uygular, böylece birkaç karakteri bu şekilde kesebilirsiniz.
SuperJedi224

3

Haskell, 39 43 46

main=do x<-readLn;print$foldr1(/)[1..x]

gösteri:

$ runhaskell coins.hs <<<2
0.5
$ runhaskell coins.hs <<<4
0.375
$ runhaskell coins.hs <<<6
0.3125
$ runhaskell coins.hs <<<8
0.2734375

Bir hata alıyorum:Undefined variable "readln"
david4dev

@ david4dev 'L' readLnbüyük bir harftir .
JB

Bence main=do x<-readLn;print$foldr1(/)[1..x]aynı şeyi yapar ve 3 bayt kaydeder?
Lynn

Aslında. Birleştirme, teşekkürler!
JB

2

J, 25 (doğal yaklaşım)

((!~-:)%2&^)&.(".@stdin)_

Örnek kullanım:

$ echo -n 2 | jconsole coins.ijs 
0.5
$ echo -n 4 | jconsole coins.ijs
0.375
$ echo -n 6 | jconsole coins.ijs
0.3125
$ echo -n 8 | jconsole coins.ijs 
0.273438

Her şey açıklayıcıdır, ancak kaba bir sorumluluk ayrılığı için:

  • !~ -:binom olarak düşünülebilir (x, x / 2)
  • % 2&^"bölü 2 ^ x "
  • &. (". @ stdin) _ I / O için

2

GNU Octave - 36 Karakter

disp(binopdf((n=input(""))/2,n,.5));

2

Ruby, 39 karakter

p 1/(1..gets.to_i).inject{|a,b|1.0*b/a}

2

Golfscript - 30 karakter

Sınırlama - yalnızca 63'ten küçük girişler için çalışır

'0.'\~..),1>\2//{{*}*}%~\/5@?*

test senaryoları

$ echo 2 | ruby golfscript.rb binom.gs 
0.50
$ echo 4 | ruby golfscript.rb binom.gs 
0.3750
$ echo 6 | ruby golfscript.rb binom.gs 
0.312500
$ echo 8 | ruby golfscript.rb binom.gs 
0.27343750

analiz

'0.'GS kayan nokta yapmaz, bu yüzden bundan sonra bir tamsayı yazarak taklit ederiz
\~. Girişleri yığının en üstüne çekin ve bir tamsayıya dönüştürün.
..Girişin 2 kopyasını
),1>alın 1. 1'den bir liste oluşturun
\2//. 1..n / 2 ve n / 2 + 1 olarak listeler. n Verilen
{{*}*}%iki alt listenin elemanlarını (n / 2) ile çarpın! ve n! / (n / 2)!
~Bu iki sayıyı yığına
\çıkarma
/Bölme çevresindeki iki sayıyı
5@?*5 ** n ile değiştirin. Yukarıda verilen sınırlamanın nedeni budur


Neden sınırlama olduğunu merak ediyorum. Tüm kombinasyonları oluşturmak için Gosper'in hackini mi kullanıyorsunuz? Fikir bana geldi (ve özellik yürütme süresi hakkında hiçbir şey söylemiyor).
Peter Taylor

Golfscript'in bir kayan nokta değişken sınıfı yoktur, bu yüzden dizeden sonra yazılan 0.cevabın ondalık kısmı olan bir tamsayıyı hesaplamaktır , ancak şans% 10'dan az büyüdüğünde bu yöntem gerekli 0'ı bırakır.
aaaaaaaaaaaa

@Peter, eBusiness ne dedi :)
gnibbler

2

TI-BASIC, 10

Bir program üstbilgisi olduğu için on bayttan fazla hesap makinesi belleği gerekir, ancak yalnızca on bayt kod vardır.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Bu, formdaki girdiyi alır [number]:[program name]; bir Input komutu eklemek üç bayt daha kullanır. ~tekli eksi belirtecidir.


1

Yakut - 50 57 54 karakter

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}

Bu olasılık değil nCr hesaplar.
david4dev

@ david4dev, düzeltildi.
Dogbert

1

J, 20

f=:(]!~[:<.2%~])%2^]

örnekler:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438

Soru bir işlev değil STDIN'den giriş ister.
Dogbert

@Dogbert: Biliyorum; Bundan bahsetmeyi unuttum. Güncellemek
istedim

1

APL 21 15 karakter

((N÷2)!N)÷2*N←⎕

Doğru olmadığı yerde

((N{ColonBar}2)!N){ColonBar}2*N{LeftArrow}{Quad}

{} İçindeki her şey burada olduğu gibi APL'ye özgü sembollerdir .


Son karakterin kare mi olması gerekiyor?
JB

Evet dörtlü bir sembol olmalı.
jpjacobs

Ben olsun�[token]: � undefined
david4dev

Sanırım bu bir kodlama sorunu. In NARS2000 kopyalamak o kadar olduğunu yapıştırabilirsiniz.
jpjacobs

1

Windows PowerShell, 45

($p=1)..($n="$input"/2)|%{$p*=(1+$n/$_)/4}
$p

Meh.



0

PostScript, 77

([)(%stdin)(r)file token{2 idiv}if def
1
1 1[{[exch div 1 add 4 div mul}for
=


0

Javascript, 86 bayt

a=prompt(f=function(n){return n?n*f(n-1):1});alert(f(a)/(f(a/2)*f(a/2)*Math.pow(2,a)))

0

Python 3, 99

Bu naif bir yaklaşım, sanırım ve fR0DDY'nin çözümü çok daha serin, ama en azından bunu çözebiliyorum.

Burada deneyin

from itertools import*
n=int(input())
print(sum(n/2==i.count("H")for i in product(*["HT"]*n))/2**n)

Python 2, 103

from itertools import*
n=int(raw_input())
print sum(n/2==i.count("H")for i in product(*["HT"]*n))/2.**n

0

Objective-C:

152 Sadece bayt için 148 bayt.

Sınıf yöntemleri, başlıklar ve kullanıcı arayüzü kodun içine dahil edilmemiştir.

Girdi: intjeton sayısını belirleyen bir değer.

Çıktı: floatolasılığı belirleyen bir değer.

-(float)calcPWithCoins:(int)x {int i=0;int j=0;for (int c=x;c<1;c+-){i=i*c;} for(int d=x/2;d<1;d+-){j=j*d;} return (((float)i/(float)j)/powf(2,x));}

Ungolfed:

-(float)calcPWithCoints:(int)x
{
    int i = 0;
    int j = 0;
    for (int c = x; c < 1; c+-) {
         i = i * c;
    }
    // Calculate the value of x! (Factorial of x)

    for (int d = x / 2; d < 1; d+-)
         j = j * d;
    }
    // Calculate (x/2)! (Factorial of x divided by 2)

    return (((float)i / (float)j) / powf(2, x));
    /* Divides i! by (i/2)!, then divides that result (known as the nCr) by 2^x.
    This is all floating-point and precise. If I didn't have casts in there,
    It would be Integer division and, therefore, wouldn't have any decimal
    precision. */
}

Bu, Microsoft Excel yanıtını temel alır . C ve Objective-C'de zorluk algoritmaları zor kodlamaktır.

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.