Cod sursa(job #1077934)

Utilizator cldmeClaudiu Ion cldme Data 11 ianuarie 2014 20:05:17
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>

const int MAX_SIR = 100;

char sir[MAX_SIR + 1];
bool variabile[26];

int N;
bool SOL;

bool evalO(char* &sir);

bool evalX(char* &sir) {
    bool answer;
    if (sir[0] == '(') { // ( O )
        ++sir; // "("
        answer = evalO(sir);
        ++sir; // ")"
    } else if (sir[0] == 'T' && sir[1] == 'R') {
        sir += 4; // "TRUE"
        answer = true;
    } else if (sir[0] == 'F' && sir[1] == 'A') {
        sir += 5; // "FALSE"
        answer = false;
    } else { // VARIABLE
        answer = variabile[sir[0] - 'A'];
        ++sir;
    }
    return answer;
}

bool evalN(char* &sir) {
    if (sir[0] == 'N' && sir[1] == 'O') { // NOT N
        sir += 4; // "NOT "
        return !evalN(sir);
    } else { // X
        return evalX(sir);
    }
}

bool evalE(char* &sir) {
    bool answer = evalN(sir);
    if (sir[0] == ' ' && sir[1] == 'A' && sir[2] == 'N') {
        sir += 5; // " AND "
        answer &= evalE(sir);
    }
    return answer;
}

bool evalO(char* &sir) {
    bool answer = evalE(sir);
    if (sir[0] == ' ' && sir[1] == 'O' && sir[2] == 'R') {
        sir += 4; // " OR "
        answer |= evalO(sir);
    }
    return answer;
}

int main(void) {
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int i;
    char c;
    char* pozitie;

    // citirea datelor
    gets(sir);

    // calcularea solutiei
    scanf("%d\n", &N);
    for (i = 0; i < N; ++i) {
        scanf("%c", &c);
        variabile[c - 'A'] = !variabile[c - 'A'];
        pozitie = sir;
        SOL = evalO(pozitie);
        //assert(pozitie == sir + strlen(sir));

        // afisarea solutiei
        printf("%d", SOL);
    }
    printf("\n");

    return 0;
}