Cod sursa(job #3157433)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 15 octombrie 2023 15:47:02
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <string>

using namespace std;

const int SIGMA = 26;
bool letters[SIGMA];

string s;
unsigned int poz;

bool expresie();

bool factor(){
    if(s[poz] == '('){
        bool val;

        poz++;
        val = expresie();
        poz++;

        return val;
    }
    else{
        if(poz < (s.size() - 3) && s[poz] == 'T' && s[poz + 1] == 'R' && s[poz + 2] == 'U' && s[poz + 3] == 'E'){
            poz += 5;
            return 1;
        }
        if(poz < (s.size() - 4) && s[poz] == 'F' && s[poz + 1] == 'A' && s[poz + 2] == 'L' && s[poz + 3] == 'S' && s[poz + 4] == 'E'){
            poz += 6;
            return 0;
        }

        return letters[s[poz] - 'A'];
    }
}

bool termen(){
    bool negat;

    negat = 0;
    while(poz < (s.size() - 2) && s[poz] == 'N' && s[poz + 1] == 'O' && s[poz + 2] == 'T'){
        poz += 4;
        negat = 1;
    }

    bool val = factor();
    if(negat){
        return !val;
    }
    else{
        return val;
    }
}

bool termen1(){
    bool val = termen();

    while(poz < (s.size() - 2) && (s[poz] == 'A' && s[poz + 1] == 'N' && s[poz + 2] == 'D')){
        poz += 4;
        val = (val & termen());
    }

    return val;
}

bool expresie(){
    bool val = termen1();

    while(poz < (s.size() - 1) && (s[poz] == 'O' && s[poz + 1] == 'R')){
        poz += 3;
        val = (val | termen1());
    }

    return val;
}

int main(){
    ifstream fin("bool.in");
    ofstream fout("bool.out");

    int n;
    char c;

    getline(fin, s);

    fin >> n;
    for(int i = 0; i < n; i++){
        fin >> c;
        letters[c - 'A'] = !letters[c - 'A'];

        poz = 0;
        fout << expresie();
    }

    return 0;
}