string(44) "cacheconfig.bf314dbbea7ed599408386d51d253c0c" string(43) "cacheconfig5f5858e6f8f0a3e2fdded6441264fd33" prolog勉強プロジェクトオイラー201~210の編集履歴ソース - c21coterie @ ウィキ - アットウィキ
※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「prolog勉強プロジェクトオイラー201~210」の編集履歴(バックアップ)一覧に戻る

prolog勉強プロジェクトオイラー201~210 - (2013/11/26 (火) 16:19:51) のソース

プロジェクトオイラーの問題を堀江伸一子と私がProlog言語で解くページ。
最近スランプ気味。

*Problem 205 「サイコロゲーム」 †
ピーターは4面のサイコロを9つ持っている. サイコロの各面には1, 2, 3, 4と書いてある. コリンは6面のサイコロを6つ持っている. サイコロの各面には1, 2, 3, 4, 5, 6と書いてある.
ピーターとコリンはサイコロを投じ, 出た目の合計を比べる. 合計が多い方が勝ちである. もし出た目の合計が等しければ勝負は引き分けになる.
ピーターがコリンに勝つ確率はいくつだろうか? 10進7桁にroundし, 0.abcdefgという形で回答欄に入力せよ.

解法
今日は完全にスランプなので一番簡単な問題を探して解。
なぜこんな簡単な問題が200番台にあるのだろう、50番台位の問題に思える?
とりあえずC++で書いて後でPrologに移植することにする。
サイコロの和の組み合わせ数を求めて、あとはピーターがコリンに勝つ確率は
Σコリンが出した合計値<ピーターが出したある合計値
を全体の組み合わせで割れば答えが出ます。

計算量は9*32*4+6*30*6+37+37+pow関数2回で2000回くらい。


 #include<stdio.h>
 #include<math.h>
 
 int main(){
 	double xai4[38]={0,};
 	double xai6[38]={0,};
 
 	
 	xai4[0]=1;
 	xai6[0]=1;
 	for(int j=0;j<9;j++){
 		for(int i=32;i>=0;i--){
 			for(int k=1;k<=4;k++)xai4[i+k]+=xai4[i];
 			xai4[i]=0;
 		}
 	}
 	for(int j=0;j<6;j++){
  		for(int i=30;i>=0;i--){
 			for(int k=1;k<=6;k++)xai6[i+k]+=xai6[i];
 			xai6[i]=0;
 		}
 	}
 
 	for(int i=2;i<37;i++){
 		xai6[i]+=xai6[i-1];
  	}
 	double perm=0;
 	for(int i=2;i<=36;i++){
 		perm+=xai4[i]*xai6[i-1];
 	}
 	
 	printf("%.7f",perm/(pow(4,9)*pow(6,6)));
 }