Cod sursa(job #1584093)

Utilizator razvandRazvan Dumitru razvand Data 29 ianuarie 2016 18:24:00
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <iostream>
#include <fstream>

using namespace std;

char s[1200];
char tmp;
int n,len;
char q[101];
char *p=s;

bool val[30];

bool eval();
bool term();
int decA;

bool eval() {

    bool expr = term();
    p += 2;
    decA += 2;

    if(*p == 'A' && *(p+1) == 'N' && *(p+2) == 'D') {

        p += 4;
        decA += 4;
        expr = expr && term();

    } else if(*p == 'O' && *(p+1) == 'R') {

        p += 3;
        decA += 3;
        expr = expr || term();

    }

    return expr;

}

bool term() {

    bool expr;

    if(*p == '(') {

        p++;  // (
        decA++;
        expr = eval();
        p++;  // )
        decA++;
        return expr;

    } else {

        if(*p == 'N' && *(p+1) == 'O' && *(p+2) == 'T') {

            p += 4;
            decA += 4;
            expr = !val[*p - 'A'];
            return expr;

        } else if(*p == 'T' && *(p+1) == 'R' && *(p+2) == 'U' && *(p+3) == 'E') {

            p += 5;
            decA += 5;
            return true;

        } else if(*p == 'F' && *(p+1) == 'A' && *(p+2) == 'L' && *(p+3) == 'S' && *(p+4) == 'E') {

            p += 6;
            decA += 6;
            return false;

        } else {

            expr = val[*p - 'A'];
            return expr;

        }

    }

}

int main() {

    ifstream in("bool.in");
    ofstream out("bool.out");

    in >> noskipws;
    int i = 0;

    while(true) {
        in >> tmp;
        if(isdigit(tmp)) {
            n = tmp - '0';
            break;
        }
        s[i] = tmp;
        i++;
    }

    in >> skipws;

    while(true) {
        in >> tmp;
        if(isdigit(tmp))
            n = n*10 + tmp - '0';
        else
            break;
    }

    len = i;

    //cout << p << endl;

    val[tmp - 'A'] ? val[tmp - 'A'] = false : val[tmp - 'A'] = true;
    out << eval();
    p -= decA;
    decA = 0;
    //cout << endl << p << endl;

    for(int i = 1; i < n; i++) {
        in >> tmp;
        val[tmp - 'A'] ? val[tmp - 'A'] = false : val[tmp - 'A'] = true;
        out << eval();
        p -= decA;
        decA = 0;
        //cout << endl << p << endl;
    }

    //cout << eval();

    return 0;
}