Cod sursa(job #2716237)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 4 martie 2021 21:00:57
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

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

int evalLowPr();

char sir[1005];
int vals[27], i = 0;
string s, axx, modif;


int evalHighPr()
{
    bool nu = false;
    int f;
    while(s[i] == '!')
    {
        ++i;
        nu = !nu;
    }
    if(s[i] == '(')
    {
        ++i;
        f = evalLowPr();
        ++i;

        if(nu)
            return !f;
        return f;
    }
    else
    {
        bool vv;
        if(s[i] == '1' || s[i] == '0')
            vv = s[i] - '0';
        else vv = vals[s[i] - 'A'];
        ++i;
        if(nu)
            return !vv;
        return vv;
    }
}


int evalMidPr()
{
    int f = evalHighPr();
    while(s[i] == '&')
    {
        ++i;
        f = (f && evalHighPr());
    }
    return f;
}

int evalLowPr()
{
    int t = evalMidPr();
    while(s[i] == '|')
    {
        ++i;
        t = (t || evalMidPr());
    }

    return t;
}

int main()
{
    fin.getline(sir, 1001);

    int lg = strlen(sir);
    int ij = 0;
    while(ij < lg)
    {
        if(sir[ij] == 'T' && sir[ij + 1] == 'R')
            s += "1", ij += 4;
        else if(sir[ij] == 'A' && sir[ij + 1] == 'N')
            s += "&", ij += 3;
        else if(sir[ij] == 'N' && sir[ij + 1] == 'O')
            s += "!", ij += 3;
        else if(sir[ij] == 'F' && sir[ij + 1] == 'A')
            s += "0", ij += 5;
        else if(sir[ij] == 'O' && sir[ij + 1] == 'R')
            s += "|", ij += 2;
        else if(sir[ij] != ' ')
            s += string(1, sir[ij]), ++ij;
        else ++ij;
    }

    //fout << s << '\n';
    fin >> axx;
    fin >> modif;

    int n = modif.size();
    for(int ii = 0; ii < n; ++ii)
    {
        vals[modif[ii] - 'A'] = 1 - vals[modif[ii] - 'A'];
        i = 0;
        fout << evalLowPr();
    }
    return 0;
}