Cod sursa(job #2600912)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 13 aprilie 2020 14:08:40
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>

using namespace std;

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

/// NOT > AND > OR
string s;
int n,i;
bool v[30];

int myor();
int myand();
int mynot();
int expresie();

int myor(){

    int raspuns = myand();
    if(s[i] == ' ')
        i++;
    while(i + 1 < n && s[i] == 'O' && s[i + 1] == 'R'){
        i += 2;
        int altceva = myand();
        raspuns = raspuns or altceva;
    }
    return raspuns;
}
int myand(){
    int raspuns = mynot();
    if(s[i] == ' ')
        i++;
    while(i + 2 < n && s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D'){
        i += 3;
        int altceva = mynot();
        raspuns = raspuns & altceva;
    }
    return raspuns;
}
int mynot(){
    int raspuns = expresie();
    if(s[i] == ' ')
        i++;
    while(i + 2 < n && s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T'){
        i += 3;
        raspuns = !mynot();
    }

    return raspuns;
}

int expresie(){
    int raspuns = 0;

    if(s[i] == ' '){
        i++;
    }
    if(i < n){
        if(s[i] == '('){
            i++;
            raspuns = myor();
            i++;
        }else{
            if(isalpha(s[i])){
                if((i == 0 && !isalpha(s[i + 1])) || (i == n - 1 && !isalpha(s[i - 1]))
                   || (!isalpha(s[i - 1]) && !isalpha(s[i + 1]))){
                        char c = s[i];
                        raspuns = v[c - 'A'];
                        i++;
                        //cout<<c<<" ";
                }else{
                    if(i + 4 < n && s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E'){
                        raspuns = 1;
                        i += 4;
                    }else if(i + 5 < n && s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E'){
                        raspuns = 0;
                        i += 5;
                    }
                }
            }
        }
    }


    return raspuns;
}

int main()
{
    getline(in,s);
    n = s.size();
    int chestii;
    in>>chestii;
    /// B or A
    for(int a = 1; a <= chestii; a++){
        char caracter;
        in>>caracter;

        if(!v[caracter - 'A'])
            v[caracter - 'A'] = 1;
        else
            v[caracter - 'A'] = 0;
        i = 0;
        out<<myor();
    }

    return 0;
}