Cod sursa(job #2791582)

Utilizator albertaizicAizic Albert albertaizic Data 30 octombrie 2021 19:53:13
Problema Bool Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#define MAX 1001

char v[MAX];
char valcar[26];
int I;
int OR();

int factor(){
  int rez;

  if(v[I]=='('){
    I++;
    rez=OR();
    I++;
  }else{
    rez=0;

    if(v[I]==1 || v[I]==0){
      rez=(rez+v[I])%2;
    }else{
      rez=(rez+valcar[v[I]-'A'])%2;
    }
    I++;
  }

  return rez;
}
int NOT(){
  int rez;

  rez=0;
  while(v[I]=='!'){
    rez=(rez+1)%2;
    I++;
  }
  rez=(rez+factor())%2;

  return rez;
}
int AND(){
  int rez;

  rez=NOT();
  while(v[I]=='&'){
    I++;
    rez=rez & NOT();
  }

  return rez;
}
int OR(){
  int rez;

  rez=AND();
  while(v[I]=='|'){
    I++;
    rez=rez | AND();
  }

  return rez;
}
void read(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'){
      i--;
      v[i]='|';
    }

    if(i>1 && v[i-2]=='A' && v[i-1]=='N' && v[i]=='D'){
      i-=2;
      v[i]='&';
    }

    if(i>1 && v[i-2]=='N' && v[i-1]=='O' && v[i]=='T'){
      i-=2;
      v[i]='!';
    }

    if(i>2 && v[i-3]=='T' && v[i-2]=='R' && v[i-1]=='U' && v[i]=='E'){
      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'){
      i-=4;
      v[i]=0;
    }
  }
}
int main(){
    FILE *fin, *fout;
    int n,i;
    char c;
    fin=fopen("bool.in","r");
    fout=fopen("bool.out","w");

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

    for(i=0;i<n;i++){
      c=fgetc(fin);
      valcar[c-'A']=(valcar[c-'A']+1)%2;
      I=0;
      fprintf(fout, "%d", OR());
    }

    fclose(fin);
    fclose(fout);
    return 0;
}