计算获得抛硬币一半头的概率。


10

编写一个程序,给定标准输入的一个小的正偶数,它计算出翻转多个硬币将导致正面数目减少一半的概率。

例如,给定2个硬币,可能的结果是:

HH HT TH TT

其中H和T是头和尾。有2个结果(HTTH)的正面数是硬币数量的一半。共有4个结果,因此概率为2/4 = 0.5。

这比看起来简单。

测试用例:

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

1
我们可以假设硬币是完美的,并且有获得正面或反面的机会吗?
胡安

我们需要将输出打印到stdout吗?
Dogbert,

@Juan是的。@Dogbert是的。
david4dev 2011年

我们能否获得更多测试用例来验证我们的解决方案?
Dogbert,

@Dogbert-完成
david4dev

Answers:


3

J,22 19(杀手法)

我在打高尔夫球的Haskell答案时就想到了这一点。

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

(与其他J回答相同的I / O )


这给了我一个错误:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev 2011年

@ david4dev哎呀。我剩下的脚本文件也不起作用。我不记得我在哪里搞砸了,但是您测试的版本确实是错误的。现在已修复。
JB


3

Python 53个字符

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

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个字节吗?
林恩

确实。合并,谢谢!
JB 2015年

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

GNU Octave-36个字符

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


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..N创建列表
\2//斯普利特将列表分为1..n / 2和n / 2 + 1..n
{{*}*}%乘以两个子列表的元素,得出(n / 2)!和n!/(n / 2)!
~将这两个数字提取到堆栈
\中将两个数字
/除以
5@?*5 ** n。这就是上述限制的原因


我很好奇为什么会受到限制。您是否正在使用Gosper的hack来生成所有组合?我想到了这个主意(规范没有说明执行时间)。
彼得·泰勒

Golfscript没有浮点变量类,因此他要做的是计算一个整数,该整数在字符串后写入,0.是答案的小数部分,但是当机会增长小于10%时,该方法将保留所需的0。
aaaaaaaaaaaaa

@Peter,电子商务所说的话:)
gnibbler 2011年

2

TI-BASIC,10

因为有一个程序标头,所以这将占用十个字节以上的计算器内存,但是只有十个字节的代码。

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

这采用以下形式的输入[number]:[program name]:添加一个输入命令会再使用三个字节。~是一元减号。



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 2011年

1

APL 21 15个字符

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

对于无法正确渲染的地方

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

{}中的所有内容都是APL专用符号,例如这里


最后一个字符应该是正方形吗?
JB

是的,它应该是四边形符号。
jpjacobs

我知道了�[token]: � undefined
david4dev 2011年

我想这是一个编码问题。在NARS2000中,您可以按原样复制粘贴。
jpjacobs 2011年

1

Windows PowerShell,45

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



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个字节

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

我想这是一种幼稚的方法,而fR0DDY的解决方案凉爽得多,但至少我能够解决它。

在这里尝试

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

蟒蛇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

目标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));}

取消高尔夫:

-(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中,挑战在于对算法进行硬编码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.