Cod sursa(job #2674286)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 18 noiembrie 2020 21:42:27
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <string>

using namespace std;

string sir;
string fin;

/*
0 = 'FALSE';
1 = 'TRUE';
& = 'AND';
! = 'NOT';
| = 'OR';
( = '(';
) = ')';
*/

int var[104];

int pos;

int exp();
int t1();
int t2();
int t3();

int exp()
{
    int val = t1();

    while (pos < fin.size() && fin[pos] == '|')
    {
        pos++;
        val = (val | t1());
    }

    return val;
}

int t1()
{
    int val = t2();

    while (pos < fin.size() && fin[pos] == '&')
    {
        pos++;
        val = (val && t2());
    }

    return val;
}

int t2()
{
    int nr = 0;

    while (pos < fin.size() && fin[pos] == '!')
    {
        pos++;
        nr++;
    }

    if (nr % 2 == 0)
    {
        return t3();
    }
    else
    {
        return (!t3());
    }
}

int t3()
{
    int val;

    if (fin[pos] == '(')
    {
        pos++;
        val = exp();
        pos++;
    }
    else if (fin[pos] == '1')
    {
        val = 1;
        pos++;
    }
    else if (fin[pos] == '0')
    {
        val = 0;
        pos++;
    }
    else
    {
        val = var[(int)fin[pos - 1]];
        pos++;
    }

    return val;
}

int main()
{
    ifstream in("bool.in");
    ofstream out("bool.out");

    getline(in, sir);

    for (int i = 0; i < sir.size(); i++)
    {
        if (sir[i] == '(')
        {
            fin.push_back('(');
        }
        else if (sir[i] == ')')
        {
            fin.push_back(')');
        }
        else if (i < sir.size() - 1 && sir[i] == 'O' && sir[i + 1] == 'R')
        {
            fin.push_back('|');
            i++;
        }
        else if (i < sir.size() - 2 && sir[i] == 'N' && sir[i + 1] == 'O' && sir[i + 2] == 'T')
        {
            fin.push_back('!');
            i += 2;
        }
        else if (i < sir.size() - 2 && sir[i] == 'A' && sir[i + 1] == 'N' && sir[i + 2] == 'D')
        {
            fin.push_back('&');
            i += 2;
        }
        else if (i < sir.size() - 3 && sir[i] == 'T' && sir[i + 1] == 'R' && sir[i + 2] == 'U' && sir[i + 3] == 'E')
        {
            fin.push_back('1');
            i += 3;
        }
        else if (i < sir.size() - 4 && sir[i] == 'F' && sir[i + 1] == 'A' && sir[i + 2] == 'L' && sir[i + 3] == 'S' && sir[i + 4] == 'E')
        {
            fin.push_back('0');
            i += 4;
        }
        else if (sir[i] != ' ')
        {
            fin.push_back(sir[i]);
        }
    }

    int n;
    char c;

    in >> n;
    for (int i = 1; i <= n; i++)
    {
        in >> c;
        var[(int)c] = 1 - var[(int)c];
        pos = 0;
        out << exp();
    }

    return 0;
}