
function gcd(x, y) {
   var u=x, v=y, w;
   while(v!=0) {
     w = u%v;
     u=v;
     v = w;
   }
   return u;
}


function fam() {
    this.nentf=1;
    this.evt=null;
    this.cond=null;
    this.ncas=0;
    this.nfav=0;
    this.str=null;
    this.liste="";
    this.arbre=true;
    this.type=0;
    this.enonce=null;

    function init(n, s, tr,stmp) {
      this.nentf = parseInt(n);
      if(stmp!=null && stmp!="") this.enonce=stmp;
      this.arbre=tr;
      var a = s.split(/#\s{0,2}\-{20}/g);
      var u;
      do {
        u = a[0];
        a[0] = a[0].replace(/[\s\n\ ]+$/,"");
      } while(a[0] != u);
      //this.str = a[0];
      var v = prepare(a[0]);
      this.str=v;
      this.separe(v);
    }
    this.init=init;

    function prepare(s) {
      var u, v=s
      do {
        u = v;
        v = v.replace(/[\s\n\ ]+$/," ");
      } while(v != u);
      v = v.toLowerCase();
      v = v.replace(/(\s)*sachant(\s)+(que){0,1}/g,"\nsachant\n");
      v = v.replace(/(\s)*quand(\s)+/g,"\nsachant\n");
      v = v.replace(/(\s)*conditionnée(\s)+par(\s)+/g,"\nsachant\n");
      return v;
    }
    this.prepare=prepare;
    
    function separe(s) {
      var a = s.split(/sachant/g);
      if(a.length==1 || a.length==2) {
         this.evt = pare(a[0]);
         this.type=1;
         if(a.length==2) {
           this.cond = pare(a[1]);
           this.type = 2;
         }
      }
    }
    this.separe=separe;

    function pare(s) {
      var u, v = s;
      v = v.toLowerCase();
      do {
        u = v;
        v = v.replace(/[\s\n\ ]+/g," ");
        v = v.replace(/fille[s]{0,1}/g," NFILLES ");
        v = v.replace(/gar[cç]on[s]{0,1}/g," NGARS " );
        v = v.replace(/enfant[s]{0,1}/g," NENFT " );
        v = v.replace(/non/g," ! " );
        v = v.replace(/contraire(\s+de){0,1}/g," ! " );
        v = v.replace(/négation/g," ! " );
        v = v.replace(/[=]{1,}/g,"==");
        v = v.replace(/>[=]+/g,">=");
        v = v.replace(/<[=]+/g,"<=");
        v = v.replace(/[=]+>/g,">=");
        v = v.replace(/[=]+</g,"<=");
        v = v.replace(/[=]+![=]*/g,"!=");
        v = v.replace(/[=]*![=]+/g,"!=");

        v = v.replace(/et/g," && ");
        v = v.replace(/ou/g," || ");
        v = v.replace(/\s+/g," ");
        v = v.replace(/^\s+/,"");
        v = v.replace(/\s+$/,"");
      } while(u != v);
      v = v.replace(/e/g,"E");
      return v;
    }
    this.pare=pare;
      
    function recurs(l, g0, f0, E) {
       var f="f", g="g"; // si quelqu'un oublie les ""
       if(l>= this.nentf) {
          var NENFT=this.nentf, NFILLES=f0, NGARS=g0;
          var test = eval(this.cond);
          if(this.type==1 || test==true) {
            var ver = eval(this.evt);
            if(ver==true) this.nfav += 1;
            this.ncas += 1;
            this.liste += E+" ; "+NENFT+" "+NFILLES+" "+NGARS+" "+ver+"\n";
          }
       } else {
          var e = new Array();
          for(var i=0;i<l;i++) e[i+1]=E[i+1];
          //e = E;
          e[l+1]="g";
          this.recurs(l+1,g0+1,f0,e);
          e[l+1]="f";
          this.recurs(l+1,g0,f0+1,e);
       }
    }
    this.recurs=recurs;
 
    function prob() {
      this.recurs(0,0,0,null);
      var num=this.nfav, den=this.ncas;
      if(this.ncas !=0) {
        var g = gcd(this.nfav,this.ncas);
        num=this.nfav/g, den=this.ncas/g;
      }
      var s1 = (g==1)? "" : " = "+num+"/"+den ;
      var s2 = num+"/"+den;
      var s= this.str + "\n"+
             "# ------------------------------\n";
          if(this.enonce != null)
            s+= this.enonce+"\n";
          if(this.ncas>0) {
             s += "La probabilité de l'événement est "+ this.nfav+"/"+this.ncas+ s1+ " = "+(this.nfav/this.ncas)+"\n(Comme toujours, l'écriture décimale donnée peut n'être qu'approchée, calculez vous-mêmes le quotient "+s2+" ).";
          } else {
             s += "pas de probabilité";
          }
          //s += "\n\nÉcriture interne, pour véfification :\n"+this.evt+"\n"
          s += "\n"
          
          //if(this.type==2) { s += "sachant "+this.cond+"\n" }
          
       var u;
       do {
         u=this.liste;
         this.liste=this.liste.replace(/true/g,"Vrai");
         this.liste=this.liste.replace(/false/g,"Faux");
         this.liste=this.liste.replace(/\,/g,"");
       } while(u!=this.liste);
       if(this.arbre==true) s += "\n"+this.liste;
       s +="\nMot ; Enfts Filles Garçons  Vérité";
      return s;
    }
    this.prob=prob;
}
var exos = new Array(
4,"filles>=3", "probabilité qu'une famille de 4 enfants ait au moins 3 filles", //0
3,"garçons >= 1","probabilité qu'une famille de 3 enfants ait au moins 1 garçon",
4,"filles>=1 et garçons >= 1","probabilité qu'une famille de 4 enfants ait au moins 1 enfant de chaque sexe",
5,"filles > garçons","probabilité qu'une famille de 5 enfants ait plus de filles que de garçons",
4,'e[1]="f" et e[2]="f"',"probabilité que les deux premiers enfants d'une famille de 4 enfants soient des filles",
4,'e[1]="f" ou e[2]="f"', "probabilité que l'un au moins des deux premiers enfants d'une famille de 4 enfants soit une fille",
4,'e[1] = e[2]', "probabilité que les deux premiers enfants d'une famille de 4 enfants soient du même sexe",
4,'(e[1]="f" et e[2]="f") ou (e[2]="f" et e[3]="f") ou (e[3]="f" et e[4]="f")', "probabilité que deux enfants consécutifs d'une famille de 4 enfants soient des filles",
4,'(e[1]="g") ou (filles>=2)', "probabilité de l'événement << si le premier des 4 enfants de la famille est une fille, alors il y a au moins 2 filles >>",
0,"", "", //9
0,"", "", 
0,"", "",
0,"","",
0,"", "",
0,"", "",
0,"", "",
0,"", "",
0,"", "",
0,"","",
0,"", "",  // 19
0,"",  "",
0,"", "",
0,"", "",
0,"", "",
0,"", "", 
0,"", "",
0,"", "",
0,"", "",
0,"", "",
0,"", "",  // 29
4,'filles>=2 sachant filles>=1', "une famille de 4 enfants a une fille ou plus, quelle est la probabilité qu'elle ait 2 filles au moins",        // 30
4,'filles>=2 sachant garçons>=2', "une famille de 4 enfants a deux garçons ou plus, quelle est la probabilité qu'elle ait 2 filles au moins",
5,'filles>=2 sachant garçons>=2', "une famille de 5 enfants a deux garçons ou plus, quelle est la probabilité qu'elle ait 2 filles au moins",
5,'filles=garçons sachant garçons>=2', "une famille de 5 enfants a deux garçons ou plus, quelle est la probabilité qu'elle ait autant de filles que de garçons",
4,'filles>=2 sachant e[1]="f"', "le premier des 4 enfants est une fille, quelle est la probabilité d'avoir au moins deux filles",
4,'filles>=2 sachant e[2]="f"', "le deuxième des 4 enfants est une fille, quelle est la probabilité d'avoir au moins deux filles",
4,'filles>=2 sachant e[3]="f"', "le troisième des 4 enfants est une fille, quelle est la probabilité d'avoir au moins deux filles",
4,'filles>=2 sachant e[4]="f"', "le quatrième des 4 enfants est une fille, quelle est la probabilité d'avoir au moins deux filles",
4,'filles>=2 sachant que filles>=1', "l'un des 4 enfants est une fille, quelle est la probabilité d'avoir au moins deux filles",
4,'filles>=2 sachant e[1]="g"', "",
4,'filles=garçons sachant e[1]="f"', "",
4,'filles=garçons sachant e[1]="g" ou  e[2]="g"', "", // 39
0,"",  "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",  // 
0,"",  "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",  // 59
4,'filles>=3 sachant filles>=5',  //  B = vide donc A/B n'est pas défini
0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",  // 
0,"",  "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", "",0,"", ""  // 
);

function exo(n) {
   
   document.frm.n.value=exos[3*n];
   document.frm.a.value=exos[3*n+1];
   if(exos[3*n+2]!="") {
     document.frm.a.value += "\n# ------------------------------\n"+exos[3*n+2];
     temp=exos[3*n+2];
   }
   //cherche();
}
function exoa(n) {
   exo(n);
   cherche();
   document.location.href='#EX1';
}
function exob(n) {
   exo(n);
   cherche();
   document.location.href='index.html#APP';
}
var temp="";
function cherche() {
   var f = new fam();
   f.init(document.frm.n.value,document.frm.a.value,true,temp);
   temp="";
   document.frm.a.value=f.prob();
}

function efface() {
   document.frm.a.value="";
}

