Sayfalar

1 Aralık 2016

Euler Projesi 205. Soru

Zar Oyunu


Pelin'in elinde her yüzü 1,2,3,4 sayılarıyla numaralandırılmış 9 adet 4-yüzlü (piramidal) zar var. Cansu'nun elinde ise her yüzü 1,2,3,4,5,6 sayılarıyla numaralandırılmış 6 adet 6-yüzlü (kübik) zar var.

Pelin ve Cansu zarları atıyorlar ve toplamları karşılaştırıyorlar: yüksek olan kazanıyor. Eğer toplamlar eşitse beraberlik oluyor.

Piramidal Pelin'in Kübik Cansu'yu yenme olasılığı kaçtır? Cevabı 7 ondalık basamağa yuvarlayarak veriniz.

Cevap: 0.5731441
c#:
public static void Run(bool sample)
   {
   long fourWins = 0;
   long sixWins = 0;
   for (int a = 1; a <= 4; ++a)
   for (int b = 1; b <= 4; ++b)
   for (int c = 1; c <= 4; ++c)
   for (int d = 1; d <= 4; ++d)
   for (int e = 1; e <= 4; ++e)
   for (int f = 1; f <= 4; ++f)
   for (int g = 1; g <= 4; ++g)
   for (int h = 1; h <= 4; ++h)
   for (int i = 1; i <= 4; ++i)

   for (int m = 1; m <= 6; ++m)
   for (int n = 1; n <= 6; ++n)
   for (int o = 1; o <= 6; ++o)
   for (int p = 1; p <= 6; ++p)
   for (int q = 1; q <= 6; ++q)
   for (int r = 1; r <= 6; ++r)
    {
    if (a + b + c + d +e +f +g +h +i > m + n + o + p + q + r)
     fourWins++;
    else
     sixWins++;
    }
   Console.WriteLine("Four wins {0} and six wins {1} for ratio {2}", fourWins, sixWins, (double)fourWins / (fourWins + sixWins));

   }
Mathematica:

p = Table[0, {n, 1, 36}];
For[i = 1, i <= Length@p, i++,
  k = IntegerPartitions[i, {9}, {1, 2, 3, 4}];
  For[j = 1, j <= Length@k, j++,
   p[[i]] += Length@Permutations[k[[j]]];
   ];
  ];
p = p/Total@p;

c = Table[0, {n, 1, 36}];
For[i = 1, i <= Length@c, i++,
  k = IntegerPartitions[i, {6}, {1, 2, 3, 4, 5, 6}];
  For[j = 1, j <= Length@k, j++,
   c[[i]] += Length@Permutations[k[[j]]];
   ];
  ];
c = c/Total@c;

z = 0;
Do[
  z += p[[x]]*Sum[c[[n]], {n, 1, x - 1}];
  ,
  {x, 1, 36}
  ];
Print[N[z, 7]];
 
Java:
long all =46656*262144;
long win=0;

for (short p1=1;p1<=4;p1++)
 for (short p2=1;p2<=4;p2++)
  for (short p3=1;p3<=4;p3++)
   for (short p4=1;p4<=4;p4++)
    for (short p5=1;p5<=4;p5++)
     for (short p6=1;p6<=4;p6++)
      for (short p7=1;p7<=4;p7++)
       for (short p8=1;p8<=4;p8++)
        for (short p9=1;p9<=4;p9++)
         for(short c1=1;c1<=6;c1++)
          for(short c2=1;c2<=6;c2++)
           for(short c3=1;c3<=6;c3++)
            for(short c4=1;c4<=6;c4++)
             for(short c5=1;c5<=6;c5++)
              for(short c6=1;c6<=6;c6++){
               int tp=p1+p2+p3+p4+p5+p6+p7+p8+p9;
               int tc=c1+c2+c3+c4+c5+c6;
               if(tp>tc)
                win++;
              }
   
   double percentage=(double)win /all;
   System.out.println(percentage);
c++:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

void Throw(int d,int n,int s,int P[])
  {
  if(n==0) 
    {
    P[s]++;
    return;
    }
  
  for(int i=1;i<=d;i++) Throw(d,n-1,s+i,P);
  }
  

int main()
  {  
  double time=clock();
  
  const int M = 36;
  
  int P[M+1],C[M+1];
  for(int i=0;i<=M;i++) P[i]=C[i]=0;
  
  Throw(4,9,0,P);
  Throw(6,6,0,C);
  
  long long a=0,b=0;
  for(int i=1;i<=M;i++)
     {
     for(int j=1;j<i;j++) a+=P[i]*C[j];
     for(int j=1;j<=M;j++) b+=P[i]*C[j];
     }
  
  cout.precision(7);
  cout<<double(a)/double(b)<<" in "<<clock()-time<<"ms"<<endl;  
  system("Pause"); return 0;
  }
Maple:
auf205:=proc()
  local i1,i2,i3,i4,i5,k,l,anz,t;
  t:=time();
  anz:=0;
  k:=[seq(0,i=1..36)];
  l:=[seq(0,i=1..36)];
  for i1 from 0 to 9 do
    for i2 from 0 to 9-i1 do
      for i3 from 0 to 9-i1-i2 do
        l[i1+2*i2+3*i3+4*(9-i1-i2-i3)]:=l[i1+2*i2+3*i3+4*(9-i1-i2-i3)]+9!/(i1!*i2!*i3!*(9-i1-i2-i3)!);
      od;
    od;
  od;
  for i1 from 0 to 6 do
    for i2 from 0 to 6-i1 do
      for i3 from 0 to 6-i1-i2 do
        for i4 from 0 to 6-i1-i2-i3 do
          for i5 from 0 to 6-i1-i2-i3-i4 do
            k[i1+2*i2+3*i3+4*i4+5*i5+6*(6-i1-i2-i3-i4-i5)]:=k[i1+2*i2+3*i3+4*i4+5*i5+6*(6-i1-i2-i3-i4-i5)]+6!/(i1!*i2!*i3!*i4!*i5!*(6-i1-i2-i3-i4-i5)!);
          od;
        od;
      od;
    od;
  od;
  anz:=sum(l[j]*sum(k[i],i=1..j-1),j=1..36);
  print(anz,evalf(anz/4^9/6^6));
  print(time()-t);
end proc;