คำนวณความน่าจะเป็นในการได้ครึ่งหนึ่งของจำนวนหัวเท่ากับการโยนเหรียญ


10

เขียนโปรแกรมที่ให้เลขจำนวนเต็มบวกเป็นค่าบวกเล็ก ๆ จากอินพุตมาตรฐานคำนวณความน่าจะเป็นที่การโยนเหรียญจำนวนมากส่งผลให้ครึ่งหนึ่งเป็นจำนวนมาก

ตัวอย่างเช่นได้รับ 2 เหรียญผลลัพธ์ที่เป็นไปได้คือ:

HH HT TH TT

ที่ H และ T เป็นหัวและก้อย มี 2 ​​ผลลัพธ์ ( HTและTH) ที่ครึ่งหัวเท่าจำนวนเหรียญ มีทั้งหมด 4 ผลลัพธ์ดังนั้นความน่าจะเป็นคือ 2/4 = 0.5

มันง่ายกว่าที่คิด

กรณีทดสอบ:

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

1
เราสามารถสรุปได้ว่าเหรียญนั้นสมบูรณ์แบบและมีโอกาสที่จะได้หัวหรือก้อย
Juan

เราจำเป็นต้องพิมพ์เอาต์พุตไปยัง stdout หรือไม่?
Dogbert

@Juan ใช่ @Dogbert ใช่
david4dev

เราจะได้รับกรณีทดสอบเพิ่มเติมเพื่อยืนยันโซลูชันของเราหรือไม่
Dogbert

@Dogbert - Done
david4dev

คำตอบ:


3

J, 22 19 (นักฆ่าเข้าใกล้)

ฉันลงไปที่นี่ในขณะที่เล่นกอล์ฟกับคำตอบของ Haskell

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

(I / O เดียวกันกับJ คำตอบอื่น ๆ ของฉัน )


นี่เป็นข้อผิดพลาดสำหรับฉัน:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ouch ไฟล์สคริปต์ที่เหลือของฉันไม่ทำงานเช่นกัน ฉันไม่จำตำแหน่งที่ฉันทำผิด แต่รุ่นที่คุณทดสอบนั้นผิดปกติ ตอนนี้ได้รับการแก้ไขแล้ว
JB

3

Pari / GP - 32 30 34 ตัวอักษร

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

ว้าวฉันไม่ได้พิจารณาภาษาการเขียนโปรแกรมที่มีฟังก์ชั่นทวินามในตัว
david4dev

32 ตัวอักษร: print(binomial(n=input,n\2)/2^n).
ชาร์ลส์


3

Excel, 25

ไม่ได้ค่อนข้างตามสเป็ค แต่ :)

ตั้งชื่อเซลล์nแล้วพิมพ์รายการต่อไปนี้ลงในเซลล์อื่น:

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

2
Excel ใช้ ^ อย่างถูกต้องเพื่อให้คุณสามารถตัดอักขระบางตัวออกมาได้
SuperJedi224

3

Haskell, 39 43 46

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

สาธิต:

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

ฉันได้รับข้อผิดพลาด:Undefined variable "readln"
david4dev

@ david4dev ตัว 'L' readLnเป็นเมืองหลวงตัวหนึ่ง
JB

ฉันคิดว่าmain=do x<-readLn;print$foldr1(/)[1..x]ทำสิ่งเดียวกันและช่วยประหยัด 3 ไบต์?
Lynn

จริง ผสานขอบคุณ!
JB

2

J, 25 (วิธีธรรมชาติ)

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

ตัวอย่างการใช้งาน:

$ 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

มันอธิบายได้ด้วยตนเอง แต่สำหรับความรับผิดชอบคร่าวๆ:

  • !~ -:อาจคิดว่าเป็นทวินาม (x, x / 2)
  • % 2&^คือ "หารด้วย2 ^ x "
  • &. (". @ stdin) _ สำหรับ I / O



2

Golfscript - 30 ตัวอักษร

ข้อ จำกัด - ใช้งานได้กับอินพุตที่น้อยกว่า 63 เท่านั้น

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

กรณีทดสอบ

$ 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

การวิเคราะห์

'0.'GS ไม่ได้เป็นทศนิยมดังนั้นเราจะปลอมมันด้วยการเขียนจำนวนเต็มหลังจากนี้
\~ดึงข้อมูลที่ด้านบนของสแต็คและแปลงเป็นจำนวนเต็ม
..ทำสำเนา 2
),1>รายการสร้างรายการจาก 1.
\2//แยก รายการเป็น 1..n / 2 และ n / 2 + 1..n
{{*}*}%คูณองค์ประกอบของทั้งสองรายการย่อยให้ (n / 2)! และ n! / (n / 2)!
~แยกตัวเลขสองตัวเหล่านี้ลงบนสแต็ก
\สลับตัวเลขสองตัวรอบ
/Divide
5@?*คูณด้วย 5 ** n นี่คือสาเหตุของข้อ จำกัด ที่ระบุข้างต้น


ฉันสงสัยว่าทำไมถึงมีข้อ จำกัด คุณใช้แฮ็คของ Gosper เพื่อสร้างชุดค่าผสมทั้งหมดหรือไม่ ความคิดเกิดขึ้นกับฉัน (และสเป็คไม่ได้พูดอะไรเกี่ยวกับเวลาดำเนินการ)
Peter Taylor

Golfscript ไม่มีคลาสตัวแปรจุดลอยดังนั้นสิ่งที่เขาทำคือการคำนวณจำนวนเต็มที่เขียนหลังจากสตริง0.เป็นส่วนทศนิยมของคำตอบ แต่วิธีการที่เหลือ 0 ที่จำเป็นเมื่อโอกาสเติบโตน้อยกว่า 10%
aaaaaaaaaaaa

@ Peter สิ่ง eBusiness กล่าว :)
gnibbler

2

TI-BASIC, 10

การดำเนินการนี้จะใช้หน่วยความจำเครื่องคิดเลขมากกว่าสิบไบต์เพราะมีส่วนหัวของโปรแกรม แต่มีรหัสสิบไบต์เท่านั้น

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

นี้จะใช้เวลาการป้อนข้อมูลในรูปแบบ[number]:[program name]; การเพิ่มคำสั่งอินพุตใช้อีกสามไบต์ ~เป็นโทเค็นลบด้วยกัน


1

Ruby - 50 57 54 ตัวอักษร

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

สิ่งนี้จะคำนวณ nCr ไม่ใช่ความน่าจะเป็น
david4dev

@ david4dev แก้ไขแล้ว
Dogbert

1

J, 20

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

ตัวอย่าง:

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

คำถามจะถามอินพุตจาก STDIN ไม่ใช่ฟังก์ชั่น
Dogbert

@Dogbert: ฉันรู้ ฉันลืมที่จะพูดถึงเรื่องนี้ ฉันตั้งใจจะอัปเดต ...
Eelvex

1

APL 21 15 ตัวอักษร

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

ในกรณีที่มันไม่ถูกต้อง

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

ที่ทุกอย่างใน {} เป็นสัญลักษณ์เฉพาะ APL ชอบที่นี่


อักขระตัวสุดท้ายควรเป็นสี่เหลี่ยมหรือไม่?
JB

ใช่มันควรเป็นสัญลักษณ์รูปสี่เหลี่ยม
jpjacobs

ฉันได้รับ�[token]: � undefined
david4dev

ฉันเดาว่านี่เป็นปัญหาการเข้ารหัส ในNARS2000คุณสามารถคัดลอกวางได้ตามต้องการ
jpjacobs






0

Python 3, 99

นี่เป็นวิธีการที่ไร้เดียงสาฉันคิดว่าและทางออกของ fR0DDY นั้นเจ๋งกว่ามาก แต่อย่างน้อยฉันก็สามารถแก้มันได้

ลองที่นี่

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 148 ไบต์สำหรับเพียงฟังก์ชั่น

วิธีการเรียนส่วนหัวและ UI ไม่รวมอยู่ในรหัส

อินพุต: intค่าที่กำหนดจำนวนเหรียญ

เอาต์พุต: floatค่าที่กำหนดความน่าจะเป็น

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

นี้จะขึ้นอยู่ออกจากคำตอบของ Microsoft Excel ใน C และ Objective-C ความท้าทายคือการเข้ารหัสอัลกอริธึมอย่างหนัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.