Cod sursa(job #2842098)

Utilizator gege42oTimus George gege42o Data 31 ianuarie 2022 09:21:46
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>

using namespace std;

const int L = 1e3;
const int N = 1e2;
const int NL = 26;

char s[L+1], schimb[N+1];
int p;
bool val[NL];

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

bool expresie()
{
    bool sau = termen();
    while (s[p] == '|')
    {
        p++;
        bool t = termen();
        sau = (sau || t);
    }
    return sau;
}

bool termen()
{
    bool shi = factor();
    while (s[p] == '&')
    {
        p++;
        bool f = factor();
        shi = (shi && f);
    }
    return shi;
}

bool factor()
{
    bool rez, semn = true;
    while (s[p] == '!')
    {
        p++;
        semn = (!semn);
    }
    if (s[p] == '(')
    {
        p++;
        rez = expresie();
        p++;
        if (!semn)
        {
            rez = (!rez);
        }
        return rez;
    }
    if (s[p] == '0')
    {
        rez = false;
    }
    else if (s[p] == '1')
    {
        rez = true;
    }
    else
    {
        rez = val[s[p]-'A'];
    }
    p++;
    if (!semn)
    {
        rez = (!rez);
    }
    return rez;
}

void transforma()
{
    int i = 0, m = 0;
    while (s[i] != '\0')
    {
        if (s[i] == 'T' && s[i+1] == 'R')
        {
            s[m++] = '1';
            i += 4;
        }
        else if (s[i] == 'F' && s[i+1] == 'A')
        {
            s[m++] = '0';
            i += 5;
        }
        else if (s[i] == 'N' && s[i+1] == 'O')
        {
            s[m++] = '!';
            i += 3;
        }
        else if (s[i] == 'A' && s[i+1] == 'N')
        {
            s[m++] = '&';
            i += 3;
        }
        else if (s[i] == 'O' && s[i+1] == 'R')
        {
            s[m++] = '|';
            i += 2;
        }
        else if (s[i] != ' ')
        {
            s[m++] = s[i++];
        }
        else///daca e spatiu
        {
            i++;
        }
    }
    s[m] = '\0';
}

int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");
    int n;
    in.getline(s, L+1);
    in >> n;
    in >> schimb;
    transforma();
    for (int i = 0; i < n; i++)
    {
        val[schimb[i]-'A'] = (!val[schimb[i]-'A']);
        p = 0;
        out << expresie();
    }
    in.close();
    out.close();
    return 0;
}