Cod sursa(job #3193438)

Utilizator DARIUSQSDarius Nicoara DARIUSQS Data 14 ianuarie 2024 16:33:57
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <bits/stdc++.h>
#include <cctype>
#define inf 1000000000
using namespace std;

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

char sir[1005];
int pos;
string s;

map<char, bool> mp;

void atribuire()
{
    int i = 0;
    int len = strlen(sir);
    while(i < len)
    {
        if(sir[i] == 'T' && sir[i+1] == 'R') 
        {
            s.push_back('1');
            i+=4;
        }
        else if(sir[i] == 'F' && sir[i+1] == 'A') 
        {
            s.push_back('0');
            i+=5;
        }
        else if(sir[i] == 'N' && sir[i+1] == 'O') 
        {
            s.push_back('!');
            i+=3;
        }
        else if(sir[i] == 'A' && sir[i+1] == 'N') 
        {
            s.push_back('&');
            i+=3;
        }
        else if(sir[i] == 'O' && sir[i+1] == 'R') 
        {
            s.push_back('|');
            i+=2;
        }
        else if(strchr("()", sir[i])) 
        {
            s.push_back(sir[i]);
            i++;
        }
        else if(sir[i]>='A' && sir[i]<='Z')
        {
            s.push_back(sir[i]);
            i++;
        }
        else if(sir[i] == ' ')
        {
            i++;
        }
    }
}

bool OR();
bool AND();
bool EXP();

bool OR()
{
    bool r = AND();
    while(s[pos] == '|')
    {
        pos++;
        bool t = AND();
        r = (r || t);
    }
    return r;
}

bool AND()
{
    bool r = EXP();
    while(s[pos] == '&')
    {
        pos++;
        bool t = EXP();
        r = (r && t);
    }
    return r;
}

bool EXP()
{
    bool r = 0;
    if(s[pos] == '(')
    {
        pos++;
        r = OR();
        pos++;
    }
    else if(s[pos] == '!')
    {
        pos++;
        r = !EXP();
    }
    else 
    {
        if(s[pos] == '1' || s[pos] == '0') 
        {
            r = s[pos] - '0';
        }
        else 
        {
            r = mp[s[pos]];
        }
        pos++;
    }
    return r;
}

int main()
{
    for(int i = 'A'; i <= 'Z'; i++) mp[i] = 0;

    mp['1'] = 1;
    mp['0'] = 0;
    char litere[101];
    fin.getline(sir, 1001);
    int n; 
    fin >> n;
    fin.get();
    fin.getline(litere, 101);
    atribuire();

    int len = strlen(litere);
    for(int i = 0; i < len; i++)
    {
        pos = 0;
        mp[litere[i]] = !mp[litere[i]];
        cout << mp['A'] <<  mp['B'] <<  mp['C'] <<  mp['D']<<endl;
        fout << OR();
    }
    /* fout << add(); */
}