※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

prolog勉強プロジェクトオイラー201~210 - (2013/11/26 (火) 15:47:51) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

+プロジェクトオイラーの問題を堀江伸一子と私が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に移植することにする。
+サイコロの和の組み合わせ数を求めて、あとはピーターがコリンに勝つ確率は
+Σコリンが出した合計値<ピーターが出したある合計値
+を全体の組み合わせで割れば答えが出ます。
+
+
+
+ #include<stdio.h>
+ #include<string.h>
+ #include<math.h>
+ int main(){
+ 	double xai4[38],nextXai4[38];
+ 	double xai6[38],nextXai6[38];
+ 	memset(xai4,0,sizeof(xai4));
+ 	memset(xai6,0,sizeof(xai6));
+	
+  	xai4[0]=1;
+ 	xai6[0]=1;
+ 	for(int j=0;j<9;j++){
+ 		memset(nextXai4,0,sizeof(nextXai4));
+ 		for(int i=32;i>=0;i--){
+			for(int k=1;k<=4;k++)nextXai4[i+k]+=xai4[i];
+ 		}
+ 		memcpy(xai4,nextXai4,sizeof(nextXai4));
+ 	}
+ 	for(int j=0;j<6;j++){
+ 		memset(nextXai6,0,sizeof(nextXai6));
+  		for(int i=30;i>=0;i--){
+ 			for(int k=1;k<=6;k++)nextXai6[i+k]+=xai6[i];
+ 		}
+ 		memcpy(xai6,nextXai6,sizeof(nextXai6));
+ 	}
+ 
+ 	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)));
+ }