// Модель игры "Ним". Два игрока. Число палок >0. 
// Каждий игрок может, за свой ход, забрать {1,2,3} палки.
// Игрок, на чей ход пришлось 0 палок - выиграл. Другой - проиграл.


#include <Estimation.txt>



void game(igrok,n){
	do{
		p=pravilo(n);
		if(p=="победа"){
			result=1;
			break;
			}
		e=getEstimations(p,n);
		i=defineX(e);
		if(typeof(e[i])!="void"){
			result=e[i];
			break;
			}
		x=p[i];
		trace((igrok?"A":"B")+":  "+n+"  -"+x);
		prevn=n;
		n-=x;
		igrok=!igrok;
		}while(1);
	if(isset(prevn)){
		trace((igrok?"A":"B")+":  "+(result?"viner":"luzer"));
		result=1-result;
		EstimationF({prevn,x,result});
		}
	trace("---------------------------------");
}


// Вернёт номер, выбраного количества удаления палок,
// который (всегда) совпадает с номером оценки его(количества).
// Первым делом выберитса один из e[!] с неизвестной оценкой.
// Если таких нет - выберится один из e[!] с победой.
// Если и таких нет - выберится "поражение" из e[!].
int defineX(e){ // {1,#,0};
	t=2;
	for(i=0;i<e.size();++i){
		x=e[i];
		if(typeof(x)=="void")t=1;
		if(t==2)if(x)t=0;
		}
	s={};
	for(i=0;i<e.size();++i){
		y=(typeof(e[i])=="void");
		if(!t && !y)if(e[i])s.push(i);
		if(t==1 && y)s.push(i);
		if(t==2 && !y)if(!e[i])s.push(i);
		}
	if(!s.size())return -1;
	return s[#];
}



// Вернёт оценки последствия для каждого варианта количества удаления палок.
// Для каждого   p[i]-количество палок    даётса оценка (выиграет/проиграит/неизвестно).
vector getEstimations(p,n){
	e={};
	for(i=0;i<p.size();++i)e.push(EstimationF({n,p[i],#}));
	return e;
}




void main(){
	for(i=1;i<=31;++i)game(rand()%2,i);
	EstimationF("SaveControl");
	EstimationF("учится");
	getstring();
}


/*
n: {2,4,7,5,7,12,9,10}
x: {1,1,4,4,1,4,1,4}
d: {0,0,1,1,1,0,1,0}   n%2
d: {2,1,1,2,1,0,0,1}   n%3
посовпадало елементов в двух рядах: 2
vector[]
vector[0,1,2]
vector[1,4]
{{2,4,7,9},{5,7,10,12}}
*/

