Cod sursa(job #1234529)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 27 septembrie 2014 15:19:03
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
using namespace std;

char s[1001];
char exp[1001];
long len;
char sch[101];
bool val[32];

void stoexp() {
    long poz1, poz2;
    poz1 = poz2 = 0;
    while(s[poz1]) {
        if(s[poz1] == ' ') {
            poz1++;
            continue;
        }
        if(s[poz1] == 'A' && s[poz1 + 1] == 'N') {
            poz1 += 3;
            exp[poz2] = '&';
            poz2++;
        } else if(s[poz1] == 'O' && s[poz1 + 1] == 'R') {
            poz1 += 2;
            exp[poz2] = '|';
            poz2++;
        } else if(s[poz1] == 'N' && s[poz1 + 1] == 'O') {
            poz1 += 3;
            exp[poz2] = '~'; // '~' Hello
            poz2++;
        } else if(s[poz1] == 'T' && s[poz1 + 1] == 'R') {
            poz1 += 4;
            exp[poz2] = '1';
            poz2++;
        } else if(s[poz1] == 'F' && s[poz1 + 1] == 'A') {
            poz1 += 5;
            exp[poz2] = '0';
            poz2++;
        } else exp[poz2++] = s[poz1++];
    }
    s[poz2] = 0;
}

bool expr(char *&p);
bool term(char *&p);
bool vall(char *&p);

bool expr(char *&p) {
    bool result, result2;
    result = term(p);
    while(*p == '|') {
        p++;
        result2 = term(p);
        result = result || result2;
    }
    if(*p == ')')
        p++;
    return result;
}

bool term(char *&p) {
    bool result, result2;
    result = vall(p);
    while(*p == '&') {
        p++;
        result2 = vall(p);
        result = result && result2;
    }
    return result;
}

bool vall(char *&p) {
    bool result;
    bool rev = false;
    while(*p == '~')
        rev = !rev;
    if(*p == '(') {
        p++;
        result = expr(p);
    } else {
        if(*p == '0' || *p == '1')
            result = *p - '0';
        else result = val[*p - 'A'];
    }
    if(rev)
        result = !result;
    return result;
}

int main() {
    long i, j;
    char *p;
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    gets(s);
    scanf("%ld\n", &len);
    gets(sch);
    stoexp();
    //printf("%s\n", exp);
    for(i = 0; i < len; i++) {
        val[sch[i] - 'A'] = !val[sch[i] - 'A'];
        p = exp;
        printf("%ld", expr(p));
    }
    return 0;
}