Cod sursa(job #1073460)

Utilizator avaspAva Spataru avasp Data 6 ianuarie 2014 13:28:52
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>

const int MAX_SIR = 100;

char sir[MAX_SIR + 1];
bool variabile[26];

int N;
bool SOL;

bool evalO(char* &sir);

bool evalX(char* &sir) {
	bool answer;
	if (sir[0] == '(') { // ( O )
		++sir; // "("
		answer = evalO(sir);
		++sir; // ")"
	} else if (sir[0] == 'T' && sir[1] == 'R') {
		sir += 4; // "TRUE"
		answer = true;
	} else if (sir[0] == 'F' && sir[1] == 'A') {
		sir += 5; // "FALSE"
		answer = false;
	} else { // VARIABLE
		answer = variabile[sir[0] - 'A'];
		++sir;
	}
	return answer;
}

bool evalN(char* &sir) {
	if (sir[0] == 'N' && sir[1] == 'O') { // NOT N
		sir += 4; // "NOT "
		return !evalN(sir);
	} else { // X
		return evalX(sir);
	}
}

bool evalE(char* &sir) {
	bool answer = evalN(sir);
	if (sir[0] == ' ' && sir[1] == 'A' && sir[2] == 'N') {
		sir += 5; // " AND "
		answer &= evalE(sir);
	}
	return answer;
}

bool evalO(char* &sir) {
	bool answer = evalE(sir);
	if (sir[0] == ' ' && sir[1] == 'O' && sir[2] == 'R') {
		sir += 4; // " OR "
		answer |= evalO(sir);
	}
	return answer;
}

int main(void) {
	int i;
	char c;
	char* pozitie;

	// citirea datelor
	gets(sir);

	// calcularea solutiei
	scanf("%d\n", &N);
	for (i = 0; i < N; ++i) {
		scanf("%c", &c);
		variabile[c - 'A'] = !variabile[c - 'A'];
		pozitie = sir;
		SOL = evalO(pozitie);
		//assert(pozitie == sir + strlen(sir));

		// afisarea solutiei
		printf("%d", SOL);
	}
	printf("\n");

	return 0;
}