/* code2function.js
*/

/* 
	garde le sens ?
	... 8 4 2 1

*/
function binaire(k, n) {
	var s ="", r;
	for(i=0;i<n;i++) {
		r = k%2;
		if(r ==0) {
			s = "D"+s;
		} else {
			s = "C"+s;
		}
		k = (k-r)/2;
	}
	return s;
}
var simplifMmode=true;
function chgSMode(){
	simplifMmode = !simplifMmode;
}
var functJsMode=true;
function chgfunctJsMode() {
	functJsMode = !functJsMode;

}
function GentoFunctionString(n0, n1, d, cg) {
	if(!functJsMode) return "";
	var 	Coop = "C", // -> true
		Defect = "D", // -> false
		s0, s1="",
		maxl=Math.max(n0, n1), 
		n= n0+n1,
		u;
		var s, s2="", s1="", s0;
/*
		// regarde si tous les caractères de d sont identiques
		var C0 = d.charAt(0), test=true;
		for(var i=1; test && i<maxl;i++) {
			if(d.charAt(i) != C0) test = false;
		}
		if(test) {
			s0 = 	'\tif(r<'+maxl+') {\n'+
				'\t\treturn '+((C0=="C")? 'true' : 'false')+';\n'+
				'\t} else ';
		} else {
			s0 =
			'\tvar debut = "'+d+'";\n'+
                        '\tif(r<'+maxl+') {\n' +
                	'\t\treturn (debut.charAt(r)=="C")?true : false;\n'+
			'\t} else ';
		}
*/
	// compte les D et les C de d = debut
	var ncar = {"C": 0, "D": 0};
	for(var i=0; i<maxl && i<d.length; i++) {
		ncar[d.charAt(i)]++;
	}
	var C0 = d.charAt(0), test=true;
	if(ncar["C"]==0 || ncar["D"]==0 ) {
		s0 =    '\tif(r<'+maxl+') {\n'+
                                '\t\treturn '+((C0=="C")? 'true' : 'false')+';\n'+
                                '\t} else ';
	} else {
		s0 = '\tif(r<'+maxl+') {\n'
		var c = "D", st="\t\tif(";
		if(ncar["C"]<=ncar["D"]) {
			c = "C";
		} 
		var k=0;
		for(var i=0; i<maxl && i<d.length; i++) {
			if(d.charAt(i)==c) {
				if(k>0) st += " || "
				st += "r=="+i;
				k++;
			}
		}
		st += ") {\n\t\t\treturn "+((c=="C")? "true" : "false")+";\n\t\t} else {\n\t\t\t"+
			"return "+((c=="C")? "false" : "true")+"\n\t\t}\n\t} else ";
		s0 += st;
	}
	var Ccar="C", Dcar="D", logiq="true", illogiq="false", nC=0;
	for(var i=0; i<n; i++) {
		if(cg.charAt(i)=="C") nC++;
	}
	if(nC>Math.floor(n/2)) {
		Ccar="D", Dcar="C", illogiq="true", logiq="false";
	}
	var	tab=new Array();
	for(var i=0; i< 2<<n; i++) {
		if(cg.charAt(i)==Ccar) {
			tab.push(binaire(i, n));
		}
	}
	
	if(simplifMmode==true) {
		var nbrecurs=7;
		var t1, t = tab;
		do {
			t1 = simplifie(t);
			nbrecurs--;
			if(t1!=null) {
				delete(t);
				t = t1;
			}
		} while(t1!=null && nbrecurs>0);
		delete(tab)
		tab = t;	
	}
	var uv = new Array();
	var U="u[r-", V = "v[r-";

	for(var i=n-1; i>=0; i--) {
		var j=n-1-i
		if(j<n0) {
			uv[j] = U+(j+1)+"]";
		} else {
			uv[j] = V+(j-n0+1)+"]";
		}
	}
	
	if(uv.length>0 && tab.length>0) {
		s1 = '\if(\t';
		var vide=true;
		for(var i=0; i<tab.length;i++) {
        	        var s11="";
			var prem=true;
			for(var j=0; j<n; j++) {
				var 	a = tab[i].charAt(j), 
					b;
				if(a=="*") {
					if(j==0) b = "      ";	
					else b = "           ";
				}
				else if(a=="C") {
					b = " "+uv[j];
				} else {
					b = "!"+uv[j];
					vide=false;
				}
				if(!prem && a != "*") {
					b = " \&\& "+b
					vide=false;
				}
				if(prem && a != "*") {
					prem = false;
					vide=false;
					if(j>0) b = "     "+b
				} 
				/*
				if(prem && a=="*" && j==n-1) {
					b = "  true ";
				}
				*/
				s11 += b
				//if(j==n-1)
				//	s11 += ")";

			}
			//if(prem) s11 += "true"
			if(!prem) s11 = "("+s11+")";
			s1 += s11;
			if(i<tab.length-1) {
				if(!prem) s1 += " ||\n\t\t\t";
			}// else {
			//	s1 += ") {\n";
			//}
		}
		if(vide) s1 += "true    ";
		s1 += ") {\n";
		s1 += 	'\t\treturn '+logiq+';\n' +
			'\t} else '
	}
	s2 = 	' {\n'+
		'\t\treturn '+illogiq+';\n' +
		'\t}\n';

//	var s =	'/* f(u, v, r) calcule votre réponse au coup de rang r\n'+
//		'   Les tableaux u et v contiennent les réponses précédentes\n'+
//		'          u: les votres    v: les siennes\n' +
//		'   r est le rang, en partant de 0, de la réponse attendue\n' +
//		'          Pour tout i, i < r, u[i] et v[i] sont connus */\n' +
//		'var f =\nfunction(u, v, r) {\n' + s0+s1+s2 + '}\n';
	var s = '//function(u, v, r) {\n' + s0+s1+s2 + '//}\n';
	return s;
}

function simplifie(tab) {
	var 	t1 = new Array(), 
		drapeaux=new Array();
	var 	test = false;
	for(var i=0; i<tab.length; i++) {
		drapeaux[i]=false;
	}
	for(var i=0; i<tab.length-1; i++) {
		for(var j=i+1; j<tab.length; j++) {
			var nn=0, r=-1, oui=true;
			for(var k=0; oui /*&& (drapeaux[i]==false) && (drapeaux[j]==false)*/ &&  k<tab[i].length; k++) {
				var 	a = tab[i].charAt(k),
					b = tab[j].charAt(k);
				if((a=="C" && b=="D") || (a=="D" && b=="C")) {
					nn++;
					r = k;
				} else if(a!=b) {
					oui=false;;
				}
			}
			if(nn == 1 && oui) {
				var s =tab[i].slice(0,r)+"*"+tab[i].slice(r+1)
				drapeaux[i]=true;
				drapeaux[j]=true;
				test = true;
				var Ok = true
				for(var z=0;Ok && z<t1.length;z++) {
					if(t1[z]==s) Ok=false;
				}
				if(Ok) {
					t1.push(s);
				}
			}
		}
	}
	for(var i=0; i<tab.length; i++) {
		if(drapeaux[i]!=true) {
			t1.push(tab[i]);
		}
	}
	
	if(test) return t1;
	else return null;
}
			

