Cod sursa(job #2708857)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 19 februarie 2021 15:28:39
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

using namespace std;

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

char s[1001];
char sir[1001];
int k = -1, n;
bool val[30];
char c;
int p;

bool expresie();
bool termen();
bool factor();

bool expresie()
{
    bool rez = termen();
    while(sir[p] == '|')
    {
        p++;
        rez = (termen() || rez);
    }
    return rez;
}

bool termen()
{
    bool ans = factor();
    while(sir[p] == '&')
    {
        p++;
        ans = (factor() && ans);
    }
    return ans;
}

bool factor()
{
    bool nu = false;
    /// daca nu == false inseamna ca am numar par de !
    /// daca nu == false return val
    /// daca nu == true return !val
    while(sir[p] == '!')
    {
        p++;
        nu = (!nu);
    }
    if(sir[p] == '(')
    {
        p++;
        bool sol = expresie();
        p++;
        if(nu == false)
            return sol;
        else
            return !sol;
    }
    bool boool;
    if(sir[p] == '1')
    {
        boool = true;
        p++;
        if(nu == false)
            return boool;
        return !boool;
    }
    if(sir[p] == '0')
    {
        boool = false;
        p++;
        if(nu == false)
            return boool;
        return !boool;
    }
    if(sir[p] >= 'A' && sir[p] <= 'Z')
    {
        boool = val[sir[p] - 'A'];
        p++;
    }
    if(nu == false)
    {
        return boool;
    }
    else
        return !boool;
}

void transforma()
{
    int i = 0;
    while(s[i] != NULL)
    {
        if(s[i] == '(')
        {
            sir[++k] = s[i];
            i++;
        }
        if(s[i] == ')')
        {
            sir[++k] = s[i];
            i++;
        }
        if(s[i] == ' ')
            i++;
        if(s[i] == 'T' && s[i+1] == 'R' && s[i+2] == 'U' && s[i+3] == 'E')
        {
            i += 4;
            sir[++k] = '1';
        }
        if(s[i] == 'F' && s[i+1] == 'A' && s[i+2] == 'L' && s[i+3] == 'S' && s[i+4] == 'E')
        {
            i += 5;
            sir[++k] = '0';
        }
        if(s[i] == 'A' && s[i+1] == 'N' && s[i+2] == 'D')
        {
            i+=3;
            sir[++k] = '&';
        }
        if(s[i] == 'O' && s[i+1] == 'R')
        {
            i+=2;
            sir[++k] = '|';
        }
        if(s[i] == 'N' && s[i+1] == 'O' && s[i+2] == 'T')
        {
            i += 3;
            sir[++k] = '!';
        }
        if(s[i] >= 'A' && s[i] <= 'Z')
        {
            sir[++k] = s[i];
            i++;
        }
    }
    sir[++k] = NULL;
}

int main()
{
    fin.getline(s,1001);
    transforma();
    fin >> n;
    for(int i = 1; i <= n; i ++)
    {
        fin >> c;

        val[c - 'A'] = (!val[c - 'A']);

        p = 0;

        fout << expresie();
    }
}