/*  metic.js
    metic.html
                    Arithmétique cryptée
    Il s'agit de remplacer les lettres par des chiffres pour reconstituer 
    les nombres de telle manière que l'égalité soit vraie.
    
    Jean-Paul Davalan 2002-2005 jpdvl@wanadoo.fr
 */
/* variables globales */
var nbcar, expr, variables, chaine, affic="",nsols=0;
var lang = "fr";

/* 

   récursivement construit tous les arrangements de k éléments
   d'un ensemble de 10 éléments 0 1 2 ...
   si le nombre est atteint, procède à l'affichage
   
   sinon, sur la liste bchaine transmise :
   a_0 a_1    a_k-1  a_k      a_9
   effectue tous les échanges possibles de a_k avec a_k ... a_9
  */
  
function perm(bchaine,k) {
  var r, i,sc,x,y,a,b;
  var arr = new Array(), chl;
  if(k>=nbcar) {    // traitement et affichage
    var cl = expr;
    for(i=0;i<nbcar;i++) {
      sc = variables.substr(i,1);
      modele = new RegExp(sc, "g");
      cl = cl.replace(modele,bchaine.substr(i,1));
    }
    var cl1 = cl.replace(/[^\d\.]+/g," ");
    //alert(cl1);
    var uu=cl1.split(/\s/)
    var test=true
    for(i=0;test && i<uu.length;i++) {
      z=eval(uu[i]);
      if(uu[i].length >1 && uu[i].charAt(0)=="0" && uu[i].charAt(0)!=".") test = false;
      else if(z==0 && uu[i]!="0") test = false;
      else if(uu[i].search(/\./g)!=-1 && uu[i].search(/0$/g)!=-1) test = false;
    }
     if(test) {
      arr = cl.split(/=/);
      x=eval(arr[0]); y=eval(arr[1]);
      if(x==y) {
        nsols++;
        affic += cl+"\n";
	if(lang=="fr")
        document.frm.sols.value = "Calcul en cours\n"+affic;
	else
	document.frm.sols.value = "Searching\n"+affic;
      }
    } 
  } else {  // on poursuit la construction des arrangements
    for(r = k; r < 10; r++) {
 /* permute k et r
    0      k          r       9
    |------|----------|-------|
  */
      if(r==k)  chl = bchaine;
      else 
chl = bchaine.substring(0,k)+bchaine.substring(r,r+1)+bchaine.substring(k+1,r)+
bchaine.substring(k,k+1)+bchaine.substring(r+1,10);
      // étape suivante
      perm(chl,k+1);
    }
  }
}

/* Efface les champs */
function efface() {
  document.frm.eq.value=""; document.frm.sols.value=""; expr="";
}

/* 

 */
function cherche() {
  var c, i, s;
  document.frm.sols.value=(lang=="fr")?"Calcul en cours\n":"Searching";
  affic="";
  nsols=0;

  variables = "";
  chaine="0123456789";

  expr = document.frm.eq.value;

  /* remplace les 'é' par des 'e' ... */
  expr = expr.replace(/[éèêë]/ig,"e"); expr = expr.replace(/[ÉÈÊË]/ig,"E");
  expr = expr.replace(/[îï]/ig,"i"); expr = expr.replace(/[ÎÏ]/ig,"I");
  expr = expr.replace(/[ùüû]/ig,"u"); expr = expr.replace(/[ÙÜÛ]/ig,"U");
  expr = expr.replace(/[ôö]/ig,"o"); expr = expr.replace(/[ÔÖ]/ig,"O");
  expr = expr.replace(/[àâä]/ig,"a"); expr = expr.replace(/[ÀÂÄ]/ig,"A");
  expr = expr.replace(/[ç]/ig,"c"); expr = expr.replace(/[Ç]/ig,"C");
  
  /* légère mise en forme */
  expr = expr.replace(/[=]/ig," = "); expr = expr.replace(/[+]/ig," + ");
  expr = expr.replace(/[-]/ig," - "); expr = expr.replace(/[\*]/ig," * ");
  expr = expr.replace(/[\/]/ig," / "); expr = expr.replace(/[\s]+/ig," ");
  expr = expr.replace(/^[\s]+/ig,""); expr = expr.replace(/[\s]+$/ig,"");

  /* copie expr dans s et élimine dans s ce qui n'est pas une lettre valide */
  s = expr; s = s.replace(/[^a-zA-Z]/ig,"");

  /* copie les lettres dans c, une seule fois chaque */
  for(i=0; i < s.length; i++) {
    c = s.substr(i,1);
    if(variables.lastIndexOf(c,s.length)==-1) variables += c;
  }
  /* nombre de lettres (et de chiffres différents) */
  nbcar=variables.length;

  /* pas plus de 10 chiffres différents permis. recherche de tous les arrangements */
  if(lang=="fr") {
    if (nbcar>10) document.sols.value="Il y a plus de 10 caractères utilisés\n";
    else  perm(chaine,0);
    document.frm.sols.value = "fin de la recherche.\n"+nsols+" solutions trouvées\n"+affic;
  } else {
    if (nbcar>10) document.sols.value="More than 10 digits in use\n";
    else  perm(chaine,0);
    document.frm.sols.value = "Search end.\n Get "+nsols+" solutions\n"+affic;
  }
}

/* ------ metic.js ------- */

