Cod sursa(job #2136896)

Utilizator EmplopiStefan Nitu Emplopi Data 20 februarie 2018 13:14:15
Problema Bool Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>

int s[1001], p, v[28];
int or();
int and();
int var();

int or(){
    int val=and();
    while(s[p]=='O' || s[p+1]=='R'){
        p+=3;
        val=val|and();
    }

    return val;
}

int and(){
    int val=var();
    while(s[p]=='A' && s[p+1]=='N'){
        p+=4;
        val=val&var();
    }

    return val;
}

int var(){
    int val=0, da=0;;
    if(s[p]=='N' && s[p+1]=='O'){
        p+=4;
        da=1;
    }
    if(s[p]=='('){
        p++;
        val=or();
        p++;
        if(s[p]==' ')
            p++;
        return val;
    }
    if(s[p]=='T' && s[p+1]=='R'){
        p+=4;
        val=1;
    }
    if(s[p]=='F' && s[p+1]=='A'){
        p+=5;
        val=0;
    }
    if(s[p]>='A' && s[p]<='Z' && (s[p+1]==' ' || s[p+1]==')')){
        val=v[s[p]-'A'];
        p++;
    }
    if(s[p]==' ')
        p++;
    if(da==1)
        return !val;

    return val;
}

int main(){
    FILE *fin, *fout;
    int n, i=0;
    char c;
    fin=fopen("bool.in", "r");
    fout=fopen("bool.out", "w");
    s[i]=fgetc(fin);
    while(s[i]!='\n'){
        i++;
        s[i]=fgetc(fin);
    }
    fscanf(fin, "%d ", &n);
    for(i=0;i<n;i++){
        fscanf(fin, "%c", &c);
        v[c-'A']=!v[c-'A'];
        fprintf(fout, "%d", or());
    }
    fclose(fin);
    fclose(fout);

    return 0;
}