Cod sursa(job #2959860)

Utilizator TeoRoGaming_YgVoinea Ionut-Florin TeoRoGaming_Yg Data 2 ianuarie 2023 20:53:36
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
#include <cstring>

using namespace std;

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

char s[L + 1], var[N + 1];
bool val_c[NL];
int p;

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

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

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

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;
    }
    char c = s[p++];
    if (c == '0')
    {
        rez = false;
    }
    else if (c == '1')
    {
        rez = true;
    }
    else
    {
        rez = val_c[c - 'A'];
    }
    if (!semn)
    {
        rez = (!rez);
    }
    return rez;
}

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

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