Cod sursa(job #3192920)

Utilizator abelesefBurduhos Abel abelesef Data 13 ianuarie 2024 15:15:41
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <iostream>
#include <fstream>
#include <string>
#include <map>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
string s;
char c;
int n, pos;
map<char, int> m;

bool OR(); // se coupa de or
bool AND(); // se ocupa de and
bool FACT(); // se ocupa de constante true false () si NOT

bool OR() {
        int res = AND();
        if (s[pos] == '|') {
                pos++;
                res = res || AND();
        }
        return res;
}

bool AND() {
        int res = FACT();
        if (s[pos] == '&') {
                pos++;
                res = res && FACT();
        }
        return res;
}

bool FACT() {
        bool res;
        if (s[pos] == '(') {
                pos++;
                res = OR();
                pos++;
        } else if (s[pos] == '!') {
                pos++;
                res = !FACT();
        } else if (s[pos] == '1' || s[pos] == '0') {
                res = s[pos] - '0';
                pos++;
        } else if (s[pos] >= 'A' && s[pos] <= 'Z') {
                res = m[s[pos]];
                pos++;
        }
        return res;
}

int main() {
        getline(fin, s);
        for (int i = 0; i < s.size(); ++i) {
                if (s[i] == ' ') s.erase(i, 1);
                if (s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E') {
                        s.erase(i, 4);
                        s.insert(i, "1");
                }
                if (s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E') {
                        s.erase(i, 5);
                        s.insert(i, "0");
                }
                if (s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T') {
                        s.erase(i, 3);
                        s.insert(i, "!");
                }
                if (s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D') {
                        s.erase(i, 3);
                        s.insert(i, "&");
                }
                if (s[i] == 'O' && s[i + 1] == 'R') {
                        s.erase(i, 2);
                        s.insert(i, "|");
                }
        }
        fin >> n;
//        for (char x='A';x<='Z';x++) m[x] = 0;
        for (int i = 1; i <= n; ++i) {
                fin >> c;
                m[c] = !m[c];
                pos = 0;
                fout << OR();
        }
//        fout << s;
        return 0;
}