Cod sursa(job #2788852)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 26 octombrie 2021 16:08:08
Problema Bool Scor 50
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <stdio.h>
#include <string.h>

#define MAXCH 1000
#define NR_LETTERS 26

char s[MAXCH];
char val_ch[NR_LETTERS];
int loc;

int AND();
int nrCalculator();

int OR() {
    int result;

    result = AND();
    while ( s[loc] == '|' ) {
        loc++;
        result = result | AND();
    }

    return result;
}

int AND() {
    int result;

    result = nrCalculator();
    while ( s[loc] == '&' ) {
        loc++;
        result = result & nrCalculator();
    }

    return result;
}

int opCalculator() {
    int result, dif;

    result = 0;
    if ( s[loc] == 1 || s[loc] == 0 ) {
        result = s[loc];
    } else { if ( s[loc] == '!' ){
        result = 1;
        loc++;
    }

    dif = 0;
    if ( s[loc] == '(' || s[loc] == '!'){
        if ( s[loc] == '(' )
            dif = 1;
        result = (result + nrCalculator()) % 2;
        loc -= dif; // daca am intrat in if pt ca am dat de '(', in nrCalculator o sa trecem de ')' cu o poz si cand o sa ne reintoarcem in nrCalculator cu inca una. Noi trebuie sa trecem de ')' doar cu o poz, nu cu doua
    }
    else
        result = (result + val_ch[s[loc] - 'A']) % 2;
    }

    return result;
}

int nrCalculator() {
    int result;

    if ( s[loc] != '(' ){
        result = opCalculator();
        loc++;
    }
    else {
        loc++;
        result = OR();
        loc++;
    }

    return result;
}

void read(char v[], FILE *fin) {
    int i;

    i = 0;
    v[i] = fgetc(fin);
    while ( v[i] != '\n' ) {
        i++;
        v[i] = fgetc(fin);

        if ( v[i] == ' ' )
            i--;

        if ( i > 0 && (v[i - 1] == 'O' && v[i] == 'R' )) { // daca avem un operator OR il inlocuim cu |
            i--;
            v[i] = '|';
        }

        if ( i > 1 && (v[i - 2] == 'A' && v[i - 1] == 'N' && v[i] == 'D')) { // daca avem un operator AND il inlocuim cu &
            i -= 2;
            v[i] = '&';
        }

        if ( i > 1 && (v[i - 2] == 'N' && v[i - 1] == 'O' && v[i] == 'T')){ // daca avem un operator NOT il inlocuim cu !
            i -= 2;
            v[i] = '!';
        }

        if ( i > 2 && (v[i - 3] == 'T' && v[i - 2] == 'R' && v[i - 1] == 'U' && v[i] == 'E')) { // daca avem un operator TRUE il inlocuim cu 1
            i -= 3;
            v[i] = 1;
        }

        if ( i > 3 && (v[i - 4] == 'F' && v[i - 3] == 'A' && v[i - 2] == 'L' && v[i - 1] == 'S' && v[i] == 'E')) { // daca avem un operator FALSE il inlocuim cu 0
            i -= 4;
            v[i] = 0;
        }
    }
}
int main() {
    FILE *fin, *fout;
    fin = fopen("bool.in", "r");
    fout = fopen("bool.out", "w");

    int n, i;
    char ch;

    read(s, fin);
    fscanf(fin, "%d", &n);
    fgetc(fin);

    while ( n-- ) {
        ch = fgetc(fin);
        val_ch[ch - 'A'] = (val_ch[ch - 'A'] + 1) % 2;

        loc = 0;
        fprintf(fout, "%d", OR());
    }

    fclose(fin);
    fclose(fout);

    return 0;
}