コイントスの半分の頭が出る確率を計算します。


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
コインは完璧で、表や裏が出る可能性はあると思いますか?
ファン

出力をstdoutに出力する必要がありますか?
Dogbert、2011

@ファンはい。@Dogbertはい。
david4dev

ソリューションを検証するためのテストケースをもう少し取得できますか?
Dogbert、2011

@Dogbert-完了
david4dev

回答:


3

J、22 19(キラーアプローチ)

私はHaskellの回答をゴルフしながら、これに取り掛かりました。

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

他のJ回答と同じI / O )


これは私にエラーを与えます:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev痛い。残りのスクリプトファイルも機能しませんでした。どこでめちゃくちゃにしたか覚えていませんが、テストしたバージョンは確かに欠陥があります。現在は修正されています。
JB

3

パリ/ GP- 32 30 34文字

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

うわー、私は組み込みの二項関数を持つプログラミング言語を考えていませんでした。
david4dev

32文字:print(binomial(n=input,n\2)/2^n)
Charles

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

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

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に入れます。2
{{*}*}%つのサブリストの要素を乗算して(n / 2)を与えます!そしてn!/(n / 2)!
~これらの2つの数値をスタックに抽出します。2つの数値を5 ** nで割る除算を
\交換します。これが上記の制限の原因です
/
5@?*


なぜ制限があるのか​​、私は興味があります。Gosperのハックを使用してすべての組み合わせを生成していますか?アイデアは私に思い浮かびました(そして、スペックは実行時間について何も述べていません)。
Peter Taylor

Golfscriptには浮動小数点変数クラスがないため、文字列の後に書き込まれる整数を計算し0.て答えの小数部分を計算しますが、その方法では、可能性が10%未満になると、必要な0 が省略されます。
aaaaaaaaaaaa 2011

@ピーター、eBusinessの発言:)
gnibbler

2

TI-BASIC、10

プログラムヘッダーがあるため、10バイトを超える計算機メモリが必要になりますが、コードは10バイトしかありません。

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

これはフォームに入力を受け取ります[number]:[program name]。入力コマンドを追加すると、さらに3バイトが使用されます。~単項マイナストークンです。



1

J、20

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

例:

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

この質問は、関数ではなくSTDINからの入力を求めます。
Dogbert、2011

@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

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)

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

非ゴルフ:

-(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.