Cod sursa(job #1495584)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 3 octombrie 2015 11:42:17
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME "bool"
#define FILES true

#define LMAX 1000
#define CMAX 256

char s[LMAX + 2], val[CMAX];
char tok[LMAX + 1];
int sp;

int expr();
int orl();
int andl();

int expr()
{
	int retval = orl();
	while (tok[sp] == '|') {
		++sp;
		retval = (retval | orl());
	}
	return retval;
}

int orl()
{
	int retval = andl();
	while (tok[sp] == '&') {
		++sp;
		retval = (retval & andl());
	}
	return retval;
}

int andl()
{
	int retval = 0;
	if (tok[sp] == '(') {
		++sp;
		retval = expr();
		++sp;
	} else if (tok[sp] == '0') {
		retval = 0;
		++sp;
	} else if (tok[sp] == '1') {
		retval = 1;
		++sp;
	} else if ('A' <= tok[sp] && tok[sp] <= 'Z') {
		retval = val[tok[sp]];
		++sp;
	} else if (tok[sp] == '!') {
		++sp;
		retval = 1 - andl();
	}
	return retval;
}

int main()
{
	FILE *fin, *fout;
	fin = FILES ? fopen(NAME".in", "r") : stdin;
	fout = FILES ? fopen(NAME".out", "w") : stdout;

	// Citire expresie
	fgets(s, LMAX, fin);
	int len = strlen(s) - 1;

	// Transformare expresie in tokeni
	int toklen = 0;
	int t = 0;
	while (t < len) {
		if (s[t] == '(' || s[t] == ')') {
			tok[toklen++] = s[t];
			++t;
		} else if (s[t] == ' ' || s[t] == '\n') {
			++t;
		} else if (s[t + 1] == ' ' || s[t + 1] == ')' || s[t + 1] == '\n') {
			tok[toklen++] = s[t];
			++t;
		} else {
			if (s[t] == 'A') {
				t += 3;
				tok[toklen++] = '&';
			} else if (s[t] == 'O') {
				t += 2;
				tok[toklen++] = '|';
			} else if (s[t] == 'N') {
				t += 3;
				tok[toklen++] = '!';
			} else if (s[t] == 'T') {
				t += 4;
				tok[toklen++] = '1';
			} else if (s[t] == 'F') {
				t += 5;
				tok[toklen++] = '0';
			} else {
				printf("Houston, we have a problem!\n");
				exit(1);
			}
		}
	}

	//for (int i = 0; i < toklen; ++i) {
	//	printf("%c", tok[i]);
	//}

	int N;
	fscanf(fin, "%d", &N);
	fgetc(fin);

	for (int i = 0; i < N; ++i) {
		char read = fgetc(fin);
		val[read] = 1 - val[read];
		
		// Afisare
		sp = 0;
		fprintf(fout, "%d", expr());
	}

	fclose(fin);
	fclose(fout);
	return 0;
}