Cod sursa(job #2700936)

Utilizator lucamLuca Mazilescu lucam Data 29 ianuarie 2021 12:38:06
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <cctype>

constexpr int N = 1000;
char s_raw[N + 1];
char s[N + 1];
char *p = s;
constexpr int A = 26;
bool vars[A];
constexpr int C = 100;
char changes[C + 1];

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

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

bool termen() {
    bool band = factor();
    while (*p == '&') {
        ++p;
        band = band && factor();
    }
    return band;
}

bool factor() {
    bool inv = false;
    bool val;
    while (*p == '!') {
        inv = !inv;
        ++p;
    }
    if (*p == '(') {
        ++p;
        val = expresie();
        ++p;
    }
    else if (*p == 'T') {
        val = true;
    }
    else if (*p == 'F') {
        val = false;
    }
    else {
        val = vars[*p - '0'];
        ++p;
    }
    return inv ? !val : val;
}

void parse(char *p) {
    char *p2 = s;
    while (*p) {
        if (isalpha(*p)) {
            if (p[1] == ' ') {
                *p2 = *p - 'A' + '0';
                ++p2;
                ++p;
            }
            else if (*p == 'T') {
                *p2 = 'T';
                ++p2;
                p += 4;
            }
            else if (*p == 'F') {
                *p2 = 'F';
                ++p2;
                p += 5;
            }
            else if (*p == 'N') {
                *p2 = '!';
                ++p2;
                p += 3;
            }
            else if (*p == 'A') {
                *p2 = '&';
                ++p2;
                p += 3;
            }
            else if (*p == 'O') {
                *p2 = '|';
                ++p2;
                p += 2;
            }
        }
        if (*p != ' ') {
            *p2 = *p;
            ++p2;
        }
        ++p;
    }
}

int main() {
    std::ifstream in("bool.in");
    std::ofstream out("bool.out");
    in.getline(s_raw, sizeof s_raw);
    parse(s_raw);
    int n;
    in >> n;
    in.ignore();
    in.getline(changes, sizeof(changes));
    for (int i = 0; i < n; ++i) {
        vars[changes[i] - 'A'] = !vars[changes[i] - 'A'];
        out << expresie();
    }
}