Hitung probabilitas mendapatkan kepala sebanyak setengah lemparan koin.

10

Tulis sebuah program yang, diberi bilangan bulat positif kecil dari input standar, menghitung probabilitas bahwa membalik koin sebanyak itu akan menghasilkan setengah kepala lebih banyak.

Sebagai contoh, diberikan 2 koin hasil yang mungkin adalah:

HH HT TH TT

di mana H dan T adalah kepala dan ekor. Ada 2 hasil ( HTdan TH) yang jumlahnya setengah dari jumlah koin. Ada total 4 hasil, jadi probabilitasnya adalah 2/4 = 0,5.

Ini lebih sederhana daripada yang terlihat.

Kasus uji:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375
david4dev
sumber
1
Kita dapat mengasumsikan koin-koin itu sempurna dan ada peluang bahkan untuk mendapatkan kepala atau ekor?
Juan
Apakah kita perlu mencetak output ke stdout?
Dogbert
@Juan ya. @ Patrick ya.
david4dev
Bisakah kita mendapatkan lebih banyak kasus uji untuk memverifikasi solusi kami?
Dogbert
@Dogbert - selesai
david4dev

Jawaban:

3

J, 22 19 (pendekatan pembunuh)

Saya membahas hal ini sambil memainkan jawaban Haskell saya.

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

(I / O yang sama dengan jawaban J saya yang lain )

JB
sumber
Ini memberikan kesalahan bagi saya:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev
@ david4dev Aduh. File skrip sisa saya juga tidak berfungsi. Saya tidak ingat di mana saya mengacau, tetapi versi yang Anda uji memang salah. Sekarang sudah diperbaiki.
JB
3

Pari / GP - 32 30 34 karakter

print(binomial(n=input(),n\2)/2^n)
Dogbert
sumber
Wow, saya tidak menganggap bahasa pemrograman memiliki fungsi binomial bawaan.
david4dev
32 karakter: print(binomial(n=input,n\2)/2^n).
Charles
3

Python 53 Karakter

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

Excel, 25

Namun tidak cukup sesuai dengan spesifikasi, :)

Beri nama sel nlalu ketikkan yang berikut ke sel lain:

=COMBIN(n,n/2)/POWER(2,n)
Joey
sumber
2
Excel sebenarnya mengimplementasikan ^ dengan benar, sehingga Anda dapat memotong beberapa karakter dengan cara itu.
SuperJedi224
3

Haskell, 39 43 46

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

Demonstrasi:

$ runhaskell coins.hs <<<2
0.5
$ runhaskell coins.hs <<<4
0.375
$ runhaskell coins.hs <<<6
0.3125
$ runhaskell coins.hs <<<8
0.2734375
JB
sumber
Saya mendapatkan kesalahan:Undefined variable "readln"
david4dev
@ david4dev the 'L' in readLnadalah modal.
JB
Saya pikir main=do x<-readLn;print$foldr1(/)[1..x]melakukan hal yang sama dan menghemat 3 byte?
Lynn
Memang. Penggabungan, terima kasih!
JB
2

J, 25 (pendekatan alami)

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

Penggunaan sampel:

$ 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

Ini semua sudah jelas, tetapi untuk sebagian besar tanggung jawab:

  • !~ -:dapat dianggap sebagai binomial (x, x / 2)
  • % 2&^adalah "dibagi dengan 2 ^ x "
  • &. (". @ stdin) _ untuk I / O
JB
sumber
2

GNU Octave - 36 Karakter

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

Ruby, 39 karakter

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

Golfscript - 30 karakter

Batasan - hanya berfungsi untuk input yang kurang dari 63

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

kasus uji

$ 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

Analisis

'0.'GS tidak melakukan floating point, jadi kami akan memalsukannya dengan menulis integer setelah ini.
\~Tarik input ke atas tumpukan dan konversikan ke integer.
..Buat 2 salinan input.
),1>Buat daftar dari 1..n
\2//Membagi daftar ke 1..n / 2 dan n / 2 + 1..n
{{*}*}%Kalikan elemen dari dua sublists yang memberi (n / 2)! dan n! / (n / 2)!
~Ekstrak dua angka itu ke tumpukan
\Tukar dua angka di sekitar
/Divide
5@?*Multiply hingga 5 ** n. Inilah penyebab keterbatasan yang diberikan di atas

gnibbler
sumber
Saya ingin tahu mengapa batasannya. Apakah Anda menggunakan hack Gosper untuk menghasilkan semua kombinasi? Idenya muncul pada saya (dan spek tidak mengatakan apa-apa tentang waktu eksekusi)
Peter Taylor
Golfscript tidak memiliki kelas variabel float point, jadi yang dia lakukan adalah menghitung bilangan bulat yang ditulis setelah string 0.adalah bagian desimal dari jawaban, tetapi metode tersebut mengabaikan 0 yang diperlukan ketika peluang tumbuh kurang dari 10%.
aaaaaaaaaaaa
@ Peter, apa yang dikatakan eBusiness :)
gnibbler
2

TI-BASIC, 10

Ini akan membutuhkan lebih dari sepuluh byte memori kalkulator karena ada tajuk program, tetapi hanya ada sepuluh byte kode.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Ini membutuhkan input dalam bentuk [number]:[program name]; menambahkan perintah Input menggunakan tiga byte lagi. ~adalah token minus unary.

lirtosiast
sumber
1

Ruby - 50 57 54 karakter

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}
Dogbert
sumber
Ini menghitung nCr bukan probabilitas.
david4dev
@ david4dev, diperbaiki.
Dogbert
1

J, 20

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

contoh:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438
Eelvex
sumber
Pertanyaannya meminta input dari STDIN, bukan fungsi.
Dogbert
@Dogbert: Saya tahu; Saya lupa menyebutkan ini. Saya bermaksud memperbaruinya ...
Eelvex
1

APL 21 15 karakter

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

Untuk tempat yang tidak tepat

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

Di mana segala sesuatu di {} adalah simbol khusus APL seperti di sini .

jpjacobs
sumber
Apakah karakter terakhir seharusnya kotak?
JB
Ya itu harus menjadi simbol quad.
jpjacobs
Saya mendapatkan�[token]: � undefined
david4dev
Saya kira ini adalah masalah pengkodean. Di NARS2000 Anda dapat menyalinnya apa adanya.
jpjacobs
1

Windows PowerShell, 45

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

Ah.

Joey
sumber
1

MATLAB, 29

n=input('');binopdf(n/2,n,.5)
Memming
sumber
0

PostScript, 77

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

Mathematica, 19

f=2^-# #!/(#/2)!^2&
Menghitung
sumber
0

Javascript, 86 byte

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)))
SuperJedi224
sumber
0

Python 3, 99

Ini adalah pendekatan yang naif, saya kira, dan solusi fR0DDY jauh lebih keren, tetapi setidaknya saya bisa menyelesaikannya.

Coba di sini

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
mbomb007
sumber
0

Tujuan-C:

152 148 byte hanya untuk fungsi.

Metode kelas, header, dan UI tidak termasuk dalam kode.

Input: intnilai yang menentukan jumlah koin.

Output: floatnilai yang menentukan probabilitas.

-(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));}

Tidak Disatukan:

-(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. */
}

Ini didasarkan dari jawaban Microsoft Excel . Dalam C dan Objective-C, tantangannya adalah dalam mengkodekan algoritma.

DDPWNAGE
sumber