Cod sursa(job #3198400)

Utilizator Giulian617Buzatu Giulian Giulian617 Data 29 ianuarie 2024 10:59:32
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
map<char,bool>truth_value;
bool expresie(const string& s,int& p);
bool termen(const string& s,int& p);
bool factor(const string& s,int& p);
bool variabila(const string& s,int& p);

bool expresie(const string& s,int& p)
{
    bool result=termen(s,p);
    while(p<(int)s.size() && s[p]=='O' && (p+1>=(int)s.size() || s[p+1]=='R'))
    {
        p+=2;
        result=result|termen(s,p);
    }
    return result;
}
bool termen(const string& s,int& p)
{
    bool result=factor(s,p);
    while(p<(int)s.size() && s[p]=='A' && (p+1>=(int)s.size() || s[p+1]=='N') && (p+2>=(int)s.size() || s[p+2]=='D'))
    {
        p+=3;
        result=result&factor(s,p);
    }
    return result;
}
bool factor(const string& s,int& p)
{
    if(s[p]=='N' && (p+1>=(int)s.size() || s[p+1]=='O') && (p+2>=(int)s.size() || s[p+2]=='T'))
    {
        p+=3;
        return 1^expresie(s,p);
    }
    else if(s[p]=='(')
    {
        p++;
        bool result=expresie(s,p);
        p++;
        return result;
    }
    else
        return variabila(s,p);
}
bool variabila(const string& s,int& p)
{
    if(s[p]=='T' && p+1<(int)s.size() && s[p+1]=='R')///enough to check for TRUE
    {
        p+=4;
        return 1;
    }
    else if(s[p]=='F' && p+1<(int)s.size() && s[p+1]=='A')///enough to check for FALSE
    {
        p+=5;
        return 0;
    }
    else
    {
        p++;
        return truth_value[s[p-1]];
    }
}

int main()
{
    int n,p=0;
    string init,s,c;
    getline(f,init);
    f>>n>>c;
    for(int i=0; i<(int)init.size(); i++)
        if(init[i]!=' ')
            s+=init[i];
    for(int i=0; i<n; i++)
    {
        p=0;
        truth_value[c[i]]=1-truth_value[c[i]];
        g<<expresie(s,p);
    }
    return 0;
}