Cod sursa(job #1543502)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 6 decembrie 2015 11:08:07
Problema Bool Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 4.27 kb
#include <stdio.h>
#include <stdlib.h>


char v[1000],op1,op2;
char vt[1000];
char vp[1000];
int stk[1000],sp;
int val[30];

void push(char c){
    stk[sp++]=c;
}
char pop(){
    return stk[--sp];
}

int main(){
    char ch;
    int i=0,len,j,n;

    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    i=0;
    while(3){
        scanf("%c",&ch);
        if(ch=='\n' || ch=='\r'){
            break;
        }

        v[i]=ch;
        i++;
    }
    v[i]=0;
    len=i;

    j=0;
    for(i=0;i<len;i++){
        if((v[i]>='A' && v[i]<='Z') && !(v[i+1]>='A' && v[i+1]<='Z') ){
            vt[j++]=v[i];
            continue;
        }
        if(v[i]=='A' ){
            vt[j++]='*';
            i+=2;
            continue;
        }
        if(v[i]=='O' ){
            vt[j++]='+';
            i+=1;
            continue;
        }
        if(v[i]=='T' ){
            vt[j++]='1';
            i+=3;
            continue;
        }
        if(v[i]=='F' ){
            vt[j++]='0';
            i+=4;
            continue;
        }
        if(v[i]=='N' ){
            vt[j++]='!';
            i+=2;
            continue;
        }
        if(v[i]=='(' || v[i]==')'){
            vt[j++]=v[i];
        }
    }
    len=j;
//
//    for(i=0;i<len;i++){
//        printf("%c",vt[i]);
//    }
//    printf("\n");

    j=0;
    for(i=0;i<len;i++){

        if((vt[i]>='A' && vt[i]<='Z') || vt[i]=='1' || vt[i]=='0'){
            vp[j++]=vt[i];
            continue;
        }

        if(sp==0){
            push(vt[i]);
            continue;
        }

        if(vt[i]=='+'){
            ch=pop();
            if(ch=='('){
                push(ch);
                push(vt[i]);
            }else if(ch=='!'){
                vp[j++]=ch;
                i--;
            }else{
                vp[j++]=ch;
                push(vt[i]);
            }
            continue;
        }

        if(vt[i]=='*'){
            ch=pop();
            if(ch=='+' || ch=='('){
                push(ch);
                push(vt[i]);
            }else if(ch=='!'){
                vp[j++]=ch;
                i--;
            }else{
                vp[j++]=ch;
                push(vt[i]);
            }
            continue;
        }
//
//        if(vt[i]=='!'){
//            ch=pop();
//            if(ch=='!'){
//                vp[j++]=ch;
//                push(vt[i]);
//            }else{
//                push(ch);
//                push(vt[i]);
//            }
//            continue;
//        }

        if(vt[i]=='!'){
            push(vt[i]);
            continue;
        }

        if(vt[i]=='(' ){
            push(vt[i]);
            continue;
        }

        if(vt[i]==')'){
            ch=pop();
            if(ch!='('){
                vp[j++]=ch;
                i--;
                continue;
            }else{
                continue;
            }
        }
    }


    for(;sp;sp--){
        vp[j++]=stk[sp-1];
    }

    len=j;

//    for(i=0;i<len;i++){
//        printf("%c",vp[i]);
//    }

    scanf("%d",&n);
    scanf("%c",&ch);
    for(i=0;i<n;i++){
        sp=0;
        scanf("%c",&ch);

        val[ch-'A']=!val[ch-'A'];

        for(j=0;j<len;j++){
            if(vp[j]>='A' && vp[j]<='Z'){
                push(val[vp[j]-'A']);
                continue;
            }

            if(vp[j]=='0' || vp[j]=='1'){
                push(vp[j]-'0');
                continue;
            }

            if(vp[j]=='+'){
                op1=pop();
                op2=pop();
                if(op1==1 || op2==1){
                    push(1);
                }else{
                    push(0);
                }
                continue;
            }

            if(vp[j]=='*'){
                op1=pop();
                op2=pop();
                if(op1==1 && op2==1){
                    push(1);
                }else{
                    push(0);
                }
                continue;
            }
            if(vp[j]=='!'){
                op1=pop();
                op1=!op1;
                push(op1);
                continue;
            }
        }
        printf("%d",stk[0]);

    }

    return 0;
}