Cod sursa(job #2324819)

Utilizator moltComan Calin molt Data 21 ianuarie 2019 16:20:19
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <bits/stdc++.h>
using namespace std;

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

char sirinit[2000],sirlit[2000],s[2000];
int vval[1000],p,l,n;

void transformare_sirinit()
{
    int n = strlen(sirinit);
    int p = 0,it = -1;
    while (p < n)
    {
        if (isalpha(sirinit[p]))
        {
            if (isalpha(sirinit[p + 1]))
            {
                if (sirinit[p + 1] == 'O')
                {
                    s[++it] = '!';
                    p += 3;
                }
                else if (sirinit[p + 1] == 'R' && sirinit[p] == 'O')
                {
                    s[++it] = '|';
                    p += 2;
                }
                else if (sirinit[p + 1] == 'A')
                {
                    s[++it] = '0';
                    p += 5;
                }
                else if (sirinit[p + 1] == 'R' && sirinit[p] == 'T')
                {
                    s[++it] = '1';
                    p += 4;
                }
                else if (sirinit[p + 1] == 'N')
                {
                    s[++it] = '&';
                    p += 3;
                }
            }
            else
                s[++it] = sirinit[p++];
        }
        else if (sirinit[p] == ' ') ++p;
        else
            s[++it] = sirinit[p++];
    }
    l = it;
}

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

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

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

bool factor()
{
    bool val = false,semn = true;
    while (s[p] == '!')
    {
        ++p;
        semn = (!semn);
    }
    if (s[p] == '(')
    {
        ++p;
        val = expresie();
        ++p;
        return semn ? val : (!val);
    }
    if (isalpha(s[p]))
    {
        val = vval[s[p]];
        ++p;
    }
    return semn ? val : (!val);

}

int main()
{
    in.getline(sirinit,2000);
    in>>n;
    in.get();
    in.getline(sirlit,2000);
    transformare_sirinit();
    int lung = strlen(sirlit);
    for (int i = 0; i < lung; ++i)
    {
        if (vval[sirlit[i]] == true) vval[sirlit[i]] = false;
        else  vval[sirlit[i]] = true;
        p = 0;
        out<<expresie();
    }
    return 0;
}