Cod sursa(job #2791939)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 31 octombrie 2021 14:32:03
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#include <string>

FILE *fin, *fout;

const int sigma = 26;
const int DIM = 1000;

int N;
int pos;
std :: string s(DIM, 0);
int val[sigma];

int eval();

int NOT() {
    int ret = 0;

    while(s[pos] == 'N' && s[pos + 1] == 'O' && s[pos + 2] == 'T') {
        ret = !ret;
        pos += 4;
    }

    return ret;
}

int fact() {
    int ret, sign;

    sign = NOT();

    if(isupper(s[pos])) {
        if(s[pos] == 'T' && s[pos + 1] == 'R' && s[pos + 2] == 'U' && s[pos + 3] == 'E') {
            ret = 1;
            pos += 3;
        } else if(s[pos] == 'F' && s[pos + 1] == 'A' && s[pos + 2] == 'L' && s[pos + 3] == 'S' && s[pos + 4] == 'E') {
            ret = 0;
            pos += 4;
        } else {
            ret = val[s[pos] - 'A'];
        }
        pos++;
    } else {
        pos++;
        ret = eval();
        pos++;
    }

    if(sign == 0) {
        return ret;
    } else {
        return !ret;
    }
}

int term() {
	int ret = fact();
	
	while(s[pos] == ' ' && s[pos + 1] == 'A' && s[pos +2] == 'N' && s[pos + 3] == 'D') {
		pos += 5;
		ret = ret & fact();
	}
	
	return ret;
}

int eval() {
    int ret = term();

	while(s[pos] == ' ' && s[pos + 1] == 'O' && s[pos +2] == 'R') {
        pos += 4;
        ret = ret | term();
    }

    return ret;
}

int main() {
    fin = fopen("bool.in", "r");
    fout = fopen("bool.out", "w");

    fgets(const_cast<char*>(s.data()), DIM, fin);
    s = s.data();

    fscanf(fin, "%d\n", &N);
    for(int i = 1; i <= N; i++) {
        char lit = fgetc(fin);
        val[lit - 'A'] = !val[lit - 'A'];
        pos = 0;
        fprintf(fout, "%d", eval());
    }

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