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

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 )


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)

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

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)

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

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

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

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


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.


1

Ruby - 50 57 54 karakter

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

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

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 .


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.



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 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)))

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.