编写一个程序,给定标准输入的一个小的正偶数,它计算出翻转多个硬币将导致正面数目减少一半的概率。
例如,给定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
编写一个程序,给定标准输入的一个小的正偶数,它计算出翻转多个硬币将导致正面数目减少一半的概率。
例如,给定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
Answers:
0 1|domain error: script | %/ >:i.&.(".@stdin)_
print(binomial(n=input(),n\2)/2^n)
print(binomial(n=input,n\2)/2^n)
。
虽然不是很规范,但:)
命名一个单元格n
,然后在另一个单元格中键入以下内容:
=COMBIN(n,n/2)/POWER(2,n)
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"
readLn
是大写字母。
main=do x<-readLn;print$foldr1(/)[1..x]
同样的事情,并节省3个字节吗?
((!~-:)%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限制-仅适用于输入少于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。这就是上述限制的原因
0.
是答案的小数部分,但是当机会增长小于10%时,该方法将保留所需的0。
p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}
f=:(]!~[:<.2%~])%2^]
例子:
f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438
APL 21 15个字符
((N÷2)!N)÷2*N←⎕
对于无法正确渲染的地方
((N{ColonBar}2)!N){ColonBar}2*N{LeftArrow}{Quad}
{}中的所有内容都是APL专用符号,例如这里。
�[token]: � undefined
代码中不包括类方法,标头和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中,挑战在于对算法进行硬编码。