Cod sursa(job #1584349)

Utilizator razvandRazvan Dumitru razvand Data 29 ianuarie 2016 22:44:42
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <iostream>
#include <fstream>

using namespace std;

char s[1200];
char *p=s;
char tmp;
int n;

bool val[30];

bool eval();
bool term();
bool factor();

int decA;
int am = 0;

bool eval() {

    bool expr = factor();

    while((*p == 'A' && *(p+1) == 'N' && *(p+2) == 'D') || (*p == 'O' && *(p+1) == 'R')) {

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

            p += 4;
            decA += 4;
            //expr = expr && temp;
            expr &= factor();

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

            p += 3;
            decA += 3;
            //expr = expr || temp;
            expr |= factor();

        }

    }

    return expr;

}

bool factor() {

    bool expr = false;

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

        p += 4;
        decA += 4;
        expr = !factor();
        return expr;

    }

    if(*p == '(') {
        p++;  // (
        decA++;
        expr = eval();
        p++;  // )
        decA++;
        return expr;
    } else if(*p == 'T' && *(p+1) == 'R' && *(p+2) == 'U' && *(p+3) == 'E') {

        if(*p == ')') {
            p += 4;
            decA += 4;
        } else {
            p += 5;
            decA += 5;
        }
        return true;

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

        if(*p == ')') {
            p += 5;
            decA += 5;
        } else {
            p += 6;
            decA += 6;
        }
        return false;

    } else {

        expr = val[*p - 'A'];
        if(*p == ')') {
            p++;
            decA++;
        } else {
            p += 2;
            decA += 2;
        }
        return expr;

    }

    return expr;

}

int main() {

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

    in.getline(s, 1001);
    in >> n;

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

    //cout << eval();

    return 0;
}