Cod sursa(job #2842148)

Utilizator alexia._.fFlorete Alexia Maria alexia._.f Data 31 ianuarie 2022 10:40:37
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <fstream>

using namespace std;

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

const int N_MAX = 1000;
const int N = 100;
const int L = 26;

char s[N_MAX + 1], c[N + 1];
int p;
bool valoare[L];

bool expresie();
bool factor();
bool termen();
void transformare();

///A AND ((B OR NOT C) OR ((TRUE)))
///A&((B|!C)|((1)))

///A  N   D
///i i+1 i+2

///N  O   T
///i i+1 i+2

///T  R   U   E
///i i+1 i+2 i+3

void transformare()
{
    int i = 0, nr = 0;

    while(s[i] != '\0')
    {
        if(s[i] == '0' && s[i + 1] == 'R')
        {
            s[nr++] = '|';
            i += 2;
        }
        else if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
        {
            s[nr++] = '!';
            i += 3;
        }
        else if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
        {
            s[nr++] = '&';
            i += 3;
        }
        else if(s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E')
        {
            s[nr++] = '1';
            i += 4;
        }
        else if(s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E')
        {
            s[nr++] = '0';
            i += 5;
        }
        else if(s[i] != ' ')
        {
            s[i++] = s[nr++];
        }
        else
        {
            i++;
        }
    }
    s[nr] = '\0';
}

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

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

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 = valoare[s[p] - 'A'];
    }
    p++;
    if (!semn)
    {
        rez = (!rez);
    }
    return rez;
}

int main()
{
    int n;
    in.getline(s, N_MAX + 1);
    in >> n;
    in >> c;
    for(int i = 0; i < n; i++)
    {
        valoare[c[i] - 'A'] = (!valoare[c[i] - 'A']);
        p = 0;
        out << expresie();
    }

    in.close();
    out.close();
    return 0;
}