 etape=0;
 OK=0;
var NB=1,SOMME=2,DIFF=3,PRODUIT=4,QUOTIENT=5,MAXNB=6
var nbCible,lstNbInit,lstNbSauves,lstNbTrav,lstOperTrav,lstOperSol,ecartSolNbCible;prob=0;
var xplaque = 1
var dern_nb, lasolution
var nombres = new Array(7)

function Nb(type,val,numOrdre,numOrdreOper2){
 this.type=type;
 this.val=val;
 this.numOrdre=numOrdre;
 this.numOrdreOper2=numOrdreOper2;
 this.init=initNb;
 this.copier=copierNb;
}

function initNb(type,val,numOrdre,numOrdreOper2){
 this.type=type;
 this.val=val;
 this.numOrdre=numOrdre;
 this.numOrdreOper2=numOrdreOper2;
}

function copierNb(n){
 this.type=n.type;
 this.val=n.val;
 this.numOrdre=n.numOrdre;
 this.numOrdreOper2=n.numOrdreOper2;
 return this;
}

function LstNb(n){
 this.nbElem=0;
 this.nb=new Array(n);
 for(var i=0;i<n;i++)
	this.nb[i]=new Nb();
 this.ajouterNb=ajouterNb;
 this.copier=copierLstNb;
 this.permutDernier=permutDernierLstNb;
}

function ajouterNb(val){
 this.nb[this.nbElem].init(NB,val,1<<this.nbElem);
 this.nbElem++;
}

function copierLstNb(lSrc){
 this.nbElem=lSrc.nbElem;
 for(var i=0;i<lSrc.nbElem;i++)
	this.nb[i].copier(lSrc.nb[i]);
}

function permutDernierLstNb(k){
 with(this){
	var tmp=nb[k];
	nb[k]=nb[nbElem];
	return nb[nbElem]=tmp;
 }
}

function Oper(operateur,operande1,operande2){
 this.operateur=operateur;
 this.operande1=operande1;
 this.operande2=operande2;
} 

function LstOper(n){
 this.nbElem=0;
 this.oper=new Array(n);
 for(var i=0;i<n;i++)
	this.oper[i]=new Oper();
 this.copier=copierLstOper;
}
  
function copierLstOper(lSrc){
 with(this){
	nbElem=lSrc.nbElem;
	for(var i=0;i<nbElem;i++){
		oper[i].operateur=lSrc.oper[i].operateur;
		oper[i].operande1=lSrc.oper[i].operande1;
		oper[i].operande2=lSrc.oper[i].operande2;
	}
 }
}

function tester(val) {
 if(Math.abs(nbCible-val)<ecartSolNbCible){
	ecartSolNbCible=Math.abs(nbCible-val);
	lstOperSol.copier(lstOperTrav);  
	return ecartSolNbCible==0; 
 }
}

function testerOper(type,k,val,numOrdreOper2){
 with(lstNbTrav){
	lstOperTrav.oper[lstOperTrav.nbElem-1].operateur=(nb[k].type=type);
	nb[k].val=val; 
	nb[k].numOrdreOper2=numOrdreOper2;
	if(tester(val))
		return true;
	return calcSol(k)
 }
}   

function calcSol(iInit){
 var nb1,nb2,operation;
 if(lstNbTrav.nbElem>1){
	lstNbTrav.nbElem--;
	lstNbSauves.nbElem++;
	operation=lstOperTrav.oper[lstOperTrav.nbElem]; 
	lstOperTrav.nbElem++;
	jInit=0;
	for(var i=iInit;i<=lstNbTrav.nbElem;i++){      
		nb1=lstNbTrav.permutDernier(i);
		operation.operande1=i;
		for(var j=jInit;j<i;j++){
			nb2=lstNbSauves.nb[lstNbSauves.nbElem-1].copier(lstNbTrav.nb[j]);
			lstNbTrav.nb[j].numOrdre=nb1.numOrdre|nb2.numOrdre;
			operation.operande2=j;
			if(nb1.type==NB||nb1.type>=PRODUIT||nb2.type==NB||nb2.type>=PRODUIT){
				if((nb1.type!=SOMME&&nb2.type!=SOMME&&nb1.type!=DIFF&&nb2.type!=DIFF)||(nb1.type==SOMME&&nb2.numOrdre>nb1.numOrdre)||(nb2.type==SOMME&&nb1.numOrdre>nb2.numOrdre))
					if(testerOper(SOMME,j,nb1.val+nb2.val))
						return true;     
				if(nb1.val>nb2.val&&nb2.type!=DIFF&&nb2.type!=SOMME&&(nb1.type!=DIFF||(nb1.type==DIFF&&nb2.numOrdre>nb1.numOrdreOper2)))
					if(testerOper(DIFF,j,nb1.val-nb2.val,nb2.numOrdre))
						return true;
				else if(nb2.val>nb1.val&&nb1.type!=DIFF&&nb1.type!=SOMME&&(nb2.type!=DIFF||(nb2.type==DIFF&&nb1.numOrdre>nb2.numOrdreOper2)))
					if(testerOper(DIFF,j,nb2.val-nb1.val,nb1.numOrdre))
						return true;
			} 
			if(nb1.type<=DIFF||nb2.type<=DIFF){
				if((nb1.type!=PRODUIT&&nb2.type!=PRODUIT&&nb1.type!=QUOTIENT&&nb2.type!=QUOTIENT)||(nb1.type==PRODUIT&&nb2.numOrdre>nb1.numOrdre)||(nb2.type==PRODUIT&&nb1.numOrdre>nb2.numOrdre))
					if(testerOper(PRODUIT,j,nb1.val*nb2.val))
						return true;
				if(nb1.val%nb2.val==0&&nb2.type!=QUOTIENT&&nb2.type!=QUOTIENT&&(nb1.type!=QUOTIENT||(nb1.type==QUOTIENT&&nb2.numOrdre>nb1.numOrdreOper2)))
					if(testerOper(QUOTIENT,j,nb1.val/nb2.val,nb2.numOrdre))
						return true;
				else if(nb2.val%nb1.val==0&&nb1.type!=QUOTIENT&&nb1.type!=QUOTIENT&&(nb2.type!=QUOTIENT||(nb2.type==QUOTIENT&&nb1.numOrdre>nb2.numOrdreOper2)))
					if(testerOper(QUOTIENT,j,nb2.val/nb1.val,nb1.numOrdre))
						return true;
			}
			lstNbTrav.nb[j].copier(nb2)
		}
		jInit = iInit;
		lstNbTrav.permutDernier(i);
	}
	lstNbTrav.nbElem++;
	lstNbSauves.nbElem--;
	lstOperTrav.nbElem--;
 }
 return false;
}      

function transformLstOper(){
 if(lstOperSol.oper[0].operateur==NB)
	lstOperSol.oper[0].operande1=lstNbTrav.nb[lstOperSol.oper[0].operande1].val;
 else{
	var carOp,val1,val2,res,tmp,nouvNbElem,
	tabOper=new Array('+','-','*','/'),
	origNb=new Array(-1,-1,-1,-1,-1,-1),
	origOper1=new Array(-1,-1,-1,-1,-1),
	origOper2=new Array(-1,-1,-1,-1,-1),
	garder=new Array(false,false,false,false,false);
	for(var i=0;i<lstOperSol.nbElem;i++)with(lstOperSol.oper[i]){
		origOper1[i]=origNb[operande1];
		origOper2[i]=origNb[operande2];
		origNb[operande2]=i;
		val1=lstNbTrav.nb[operande1].val;
		val2=lstNbTrav.nb[operande2].val;
		carOp=tabOper[lstOperSol.oper[i].operateur-2];
		if((carOp=='-'||carOp=='/')&&val1<val2){
			tmp=val1;
			val1=val2;
			val2=tmp;
		}
		res=eval(val1+carOp+val2); 
		lstNbTrav.nb[operande2].val=res;
		lstNbTrav.nbElem--;
		lstNbTrav.nb[operande1].val=lstNbTrav.nb[lstNbTrav.nbElem].val;
		operande1=val1;
		operande2=val2;
	}
	garder[lstOperSol.nbElem-1]=true;
	for(var i=lstOperSol.nbElem-1;i>=0;i--){
		if(garder[i]){
		        if(origOper1[i]!=-1)
				garder[origOper1[i]]=true;
			if(origOper2[i]!=-1)
				garder[origOper2[i]]=true;
		}
	}
	nouvNbElem=0;
	for(var i=0;i<lstOperSol.nbElem;i++)
		if(garder[i]){
			lstOperSol.oper[nouvNbElem]=lstOperSol.oper[i];
			nouvNbElem++;
		}
		lstOperSol.nbElem=nouvNbElem;
 }
}

function lireNb(){
 var val,operation;
 nbCible=a_trouver;
 operation=lstOperTrav.oper[lstOperTrav.nbElem];
 lstOperTrav.nbElem++;
 for(var i=1;i<=6;i++){
	val=nombres[i];
	if(!isNaN(val)&&val>0)with(lstNbInit){
		ajouterNb(val);
		operation.operateur=NB;
		operation.operande1=lstNbInit.nbElem-1;
		tester(val);
	}
 }
 lstOperTrav.nbElem--;
 if(lstNbInit.nbElem!=0)
	return true;
 return false;
}

function ecrireSol(){
 lasolution='';
 if(lstOperSol.oper[0].operateur==NB)
	lasolution=lstOperSol.oper[0].operande1;
 else{
	var carOp,tabOper=new Array(' + ',' - ',' * ',' / ');
	for(var i=0;i<lstOperSol.nbElem;i++)with(lstOperSol.oper[i]){
		carOp=tabOper[lstOperSol.oper[i].operateur-2];
		res=eval(operande1+carOp+operande2);
		lasolution+=operande1;
		lasolution+=carOp;
		lasolution+=operande2;
		lasolution+=' = '+res+"\r";
	}
 }
 if(comptebon){
	lasolution=" \r Voici le compte :\r \r"+lasolution;
 }else{ 
 	lasolution=" \r Mon meilleur résultat est :\r \r"+lasolution;
 } 
 document.COMPTE.resultat.value=lasolution;
 document.COMPTE.solu.focus()
}


function resoudre(){
 init_game()
	lstNbTrav=new LstNb(MAXNB);
	lstNbInit=new LstNb(MAXNB);
	lstNbSauves=new LstNb(MAXNB);
	lstOperTrav=new LstOper(MAXNB-1);
	lstOperSol=new LstOper(MAXNB-1);
	ecartSolNbCible=1000;
	if(lireNb()){
		lstNbTrav.copier(lstNbInit);
		if(ecartSolNbCible!=0){
			comptebon=calcSol(0);
			lstNbTrav.copier(lstNbInit);
			transformLstOper();
		}
	}
}

function suite(){
 if(prob == 0) {document.COMPTE.Tirage.focus()};
 if(prob == 1) {prob = 0 ; resoudre(); ecrireSol();document.COMPTE.Tirage.focus()}
}

function init_context(){
 for(i=0;i<=16;i++){
	for(j=0;j<=16;j++){
		context[i][j]=0;
	}
 }
 context[0][0]=1;
 context[0][1]=1;
 context[0][2]=1;
 context[0][3]=1;
 context[0][4]=2;
 context[0][5]=2;
 context[0][6]=2;
 context[0][7]=2;
 context[0][8]=2;
 context[0][9]=2;
 context[0][10]=3;
 context[0][11]=3;
 context[0][12]=3;
 context[0][13]=3;
 context[0][14]=3;
 context[0][15]=0;
 context[0][16]=0;
}

function rand(a,b){
 rndm=Math.random();
 rndm=Math.round(rndm*(b-a));
 rndm=rndm+a;
 return(rndm);
}

function init_nombre(){
 
 plaque = new Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 25, 50, 75, 100);
 flag_1 = new Array();
 nombres= new Array();
 tot=0;
 for(i=1;i<24;i++){
	flag_1[i]=1;
 }

 while (tot<6){
	al=Math.random();
	al=al*22;
	al=Math.round(al);
	if(flag_1[al]==1){
		tot++;
		nombres[tot]=plaque[al];
		flag_1[al]=0;
	}
 }
 OK=1;
 a_trouver=rand(200,999);
 document.getElementsByName("n1").value = nombres[1];
 document.getElementsByName("n2").value = nombres[2];
 document.getElementsByName("n3").value = nombres[3];
 document.getElementsByName("n4").value = nombres[4];
 document.getElementsByName("n5").value = nombres[5];
 document.getElementsByName("n6").value = nombres[6];
 document.getElementsByName("nx").value = a_trouver;
}

function init_game(){
 etape=0;
 compt_nb=0;
 compt_interm=0;
 dern_nb = 0;
 lasolution ="";
 c0=new Array();
 c1=new Array();
 c2=new Array();
 c3=new Array();
 c4=new Array();
 c5=new Array();
 c6=new Array();
 c7=new Array();
 c8=new Array();
 c9=new Array();
 c10=new Array();
 c11=new Array();
 c12=new Array();
 c13=new Array();
 c14=new Array();
 c15=new Array();
 c16=new Array();
 context=new Array(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16);
 operat=new Array();
 interm=new Array();
 action=new Array();
 action_val=new Array();
 operat[0]='+';
 operat[1]='-';
 operat[2]='*';
 operat[3]='/';
 action[0]="";
 init_context();
 nombres[1]=eval(document.COMPTE.n1.value);
 nombres[2]=eval(document.COMPTE.n2.value);
 nombres[3]=eval(document.COMPTE.n3.value);
 nombres[4]=eval(document.COMPTE.n4.value);
 nombres[5]=eval(document.COMPTE.n5.value);
 nombres[6]=eval(document.COMPTE.n6.value);
 a_trouver=eval(document.COMPTE.nx.value);
}

function ok_div(n1,n2){
 x=0;
 if((Math.round(n1/n2)-n1/n2)==0)
	x=1;
 return(x);
}

function divi_ok(nombre1,pos1){
 x=0;
 for(k=4;k<15;k++){
	if((context[etape-1][k]==2)&&(k!=pos1)){
		if(Math.floor(nombre1/nombres[k-3])-(nombre1/nombres[k-3])==0)
			x=1;
	}
 }
 return(x);
}

function moins_ok(nombre1,pos1){
 x=0;
 for (k=4;k<15;k++){
	if((context[etape-1][k]==2)&&(k!=pos1)){
		if(nombre1-nombres[k-3]>0)
			x=1;
	}
 }
 return(x);
}

function calcule_res(){
 compt_interm++;
 if(action[etape-1]=='+')
	interm[compt_interm]=action_val[etape-2]+action_val[etape];
 if(action[etape-1]=='-')
	interm[compt_interm]=action_val[etape-2]-action_val[etape];
 if (action[etape-1]=='*')
	interm[compt_interm]=action_val[etape-2]*action_val[etape];
 if (action[etape-1]=='/')
	interm[compt_interm]=action_val[etape-2]/action_val[etape];
 context[etape][9+compt_interm]=2;
 nombres[6+compt_interm]=interm[compt_interm];
 for(k=4;k<15;k++){
	if(context[etape][k]==1)
		context[etape][k]=2;
 }
 for(k=0;k<4;k++){
	context[etape][k]=1;
 }
 return(interm[compt_interm]);
}


