Cod sursa(job #2791808)

Utilizator vladburacBurac Vlad vladburac Data 31 octombrie 2021 09:16:43
Problema Bool Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXS 1000

char s[MAXS];
int i;
int val[28];

void readSpace() {
  while( s[i] == ' ' )
    i++;
}

int calcOr();

int factor() {
  int nr;
  if( s[i] == '(' ) {
    i++;
    readSpace();
    nr = calcOr();
    i++;
    if( nr == 1 )
      nr = 26;
    else
      nr = 27;
    readSpace();
  }
  else if( s[i] == 'T' && s[i+1] == 'R' ) {
    nr = 26;
    i += 4;
    readSpace();
  }
  else if( s[i] == 'F' && s[i+1] == 'A' ) {
    nr = 27;
    i += 5;
    readSpace();
  }
  else {
    nr = s[i] - 'A';
    i++;
    readSpace();
  }
  return val[nr];
}

int calcNot() {
  int rez, sens;
  sens = 0;
  while( s[i] == 'N' && s[i+1] == 'O' ) {
    i += 3;
    readSpace();
    sens = 1 - sens;
  }
  if( sens == 0 )
    rez = factor();
  else
    rez = 1 - factor();
  readSpace();
  return rez;
}

int calcAnd() {
  int rasp;
  rasp = calcNot();
  readSpace();
  while( s[i] == 'A' && s[i+1] == 'N' ) {
    i += 3;
    readSpace();
    rasp = rasp & calcNot();
    readSpace();
  }
  return rasp;
}

int calcOr() {
  int rasp;
  rasp = calcAnd();
  readSpace();
  while( s[i] == 'O' && s[i+1] == 'R' ) {
    i += 2;
    readSpace();
    rasp = rasp | calcAnd();
    readSpace();
  }
  return rasp;
}

int main() {
  FILE *fin, *fout;
  int n, j;
  char ch;
  fin = fopen( "bool.in", "r" );
  fout = fopen( "bool.out", "w" );
  fgets( s, MAXS, fin );
  fscanf( fin, "%d", &n );
  fgetc( fin );
  val[26] = 1;
  val[27] = 0;
  for( j = 0; j < n; j++ ) {
    ch = fgetc( fin );
    val[ch-'A'] = 1 - val[ch-'A'];
    i = 0;
    fprintf( fout, "%d", calcOr() );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}