#include "code\Deployment\Deployment.txt"

//----------------------------------------------------------------------------------------------
void main(){
	SYS=(map)0;
	Deployment(&SYS,"стартовое состояние",{1,1,1,1});
	Deployment(&SYS,"метод текстового описания состояния","toStringStan");
	Deployment(&SYS,"признак конечного состояния","gotovo");
	Deployment(&SYS,"признак допустимого состояния","oksystem");
	Deployment(&SYS,"методы изменения состояния",{"perepravil"});
	Deployment(&SYS,"подготовка параметров к методам изменения состояния",{"chengperepravil"});
	//Deployment(&SYS,"включить отображение новых состояний");
	Deployment(&SYS,"развернуть систему");
	Deployment(&SYS,"распечатка системы");
	trace();
/*
	way=Deployment(&SYS,"взять последовательность случайного кратчайшего пути");
	Deployment(&SYS,"распечатка состояний по заданному пути",way);
	trace();

	n=ComputeSpaceWAYS(&SYS,"");
	trace("Количество возможных путей: "+n);

	trace(
		"На разворачивание системы ушло времени: " +
		Deployment(&SYS,"сколько времени ушло на разворачивание?")
		);
*/
	getstring();
}


// Метод для подготовки параметров к методу изменения состояния
var chengperepravil(S){
	v={};
	for(i=0;i<S->size();++i)if((*S)[0]==(*S)[i])v.push({i});
	return v;
}


// методы изменения состояния
void perepravil(S,n){
	p=(*S)[0];
	p=1-p;
	(*S)[0]=p;
	if(!n)return;
	(*S)[n]=p;
}


// 1 - допустимое состояние, 0 - недопустимое состояние.
bool oksystem(S){
	if( (*S)[1]==(*S)[2] )if((*S)[0]!=(*S)[1])return 0;
	if( (*S)[3]==(*S)[2] )if((*S)[0]!=(*S)[2])return 0;
	return 1;
}


// Вернет 1, когда S=={0,0,0,0}
bool gotovo(S){
	for(i=0;i<S->size();++i)if((*S)[i])return 0;
	return 1;
}


// Вернёт строку, по которой видно, кто на каком берегу.
string toStringStan(S){
	m={"Я","Капуста","Коза","Волк"};
	a={};
	b={};
	for(i=0;i<m.size();++i)((*S)[i]?a:b).push(m[i]);
	return a.implode(", ").rovno(23)+" | "+b.implode(", ").rovno(23);
}
