#include <stdio.h>

int turing(int current_state, int finish_state, int *program, int *program_end, int *tape)
{
	int *pc;
	int *current_pos = tape+2; //zaczynamy od pierwszego miejca na tasmie
	int absolute_pos;
	int left_shift = 1; 
	int right_shift = 2; 

	while(current_state != finish_state) 
	{
		for(pc = program ; pc != program_end ; pc += 5) 
		{
			if(*pc == current_state &&
			   *(pc+1) == *current_pos)
				break;
		}
		if(pc == program_end)
			return -1;
		*current_pos = *(pc+2);

		absolute_pos = current_pos-tape;
		if(*(pc+3) == left_shift) 
		{
			if(absolute_pos==0)
				current_pos=tape+1;
			else if((absolute_pos%2)==0)
				current_pos-=2;
			else if((absolute_pos%2)==1)
				current_pos+=2;
		}
		if(*(pc+3) == right_shift) 
		{
			if(absolute_pos==1)
				current_pos=tape;
			else if((absolute_pos%2)==0)
				current_pos+=2;
			else if((absolute_pos%2)==1)
				current_pos-=2;
		}
		current_state = *(pc+4);
	} 
	return 0;
}
enum states //stany
{
	q0, q1, q2, q3, q4, q5, qf
};

enum symbols //symbole binarne
{
	sB, s0, s1
};

enum moves
{
	m_, mL, mR
};

int main()
{
	int program[] = {
	q0, s0, s0, mR, q0,
	q0, s1, s1, mR, q0,
	q0, sB, sB, mL, q1,
	q1, s0, s1, mL, q2,
	q1, s1, s0, mL, q1,
	q1, sB, sB, mR, q3,
	q2, s0, s0, mL, q2,
	q2, s1, s1, mL, q2,
	q2, sB, sB, mR, qf,
	q3, s0, s1, mR, q4,
	q4, s0, s0, mR, q4,
	q4, sB, s0, mL, q5,
	q5, s0, s0, mL, q5,
	q5, s1, s1, m_, qf
	};
	int tape[100] = {sB, sB, s1, sB, s0, sB, s1, sB, s1, sB, s1, sB, sB};
	int *program_end = program + 5*14;
	int i;

	printf("Kod powrotu: %d\n", turing(q0, qf, program, program_end, tape));
	printf("Stan tasmy:\n");
	i=0;
	do
	{
		switch(tape[i])
		{
			case sB:
			printf("B");
			break;

			case s0:
			printf("0");
			break;

			case s1:
			printf("1");
			break;
		}
		i+=2;
	} while(tape[i]!=sB);
	printf("\n");
}

