Cod sursa(job #2790423)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 28 octombrie 2021 22:38:38
Problema Bool Scor 30
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h> ///Va prezint: FrankenBool!
#include <stdlib.h> /// Programul era la inceput destul de elegant, dar apoi l am tot peticit, asa ca acum...
#define AZ 26      ///Este o opera de arta presupun
#define LSIRMAX 1001 ///O sa fiu foarte mandru daca functioneaza
#define SPACESOR 2

char s[LSIRMAX], v[AZ];
int si,sl;

int or();

int factor(){
  if(s[si] == ' ')
    si++;

  int auxi = si;
  while(s[si] >= 'A' && s[si] <= 'Z')
    si ++;

  if(si - auxi == 1)
    return v[s[auxi] - 'A'];

  else{ ///Nu este variabila

    if(s[auxi] == 'T')      /// TRUE este 1
      return 1;
    else if(s[auxi] == 'F') /// FALSE este 0
      return 0;
    else if(s[auxi] == 'N') /// NOT este -1
      return -1;
    else if(s[auxi] == 'A') /// AND este -2
      return -2;
    else if(s[auxi] == 'O') /// OR este -3
      return -3;
    else
      return -4;            /// Am dat de o paranteza inchisa )
  }
}

int not(){
  int r=0,nr = 0;
  if(s[si] == ' ')
    si++;

  if(s[si] == '('){
    si ++;
    r = or();
    si ++;
  } else
    while((r = factor()) == -1)
      nr++;

  if(nr%2 == 1)
    return 1-r;
  return r;
}

int and(){
  int r,t,semn = 0;

  r = not();

  semn = factor();
  while (semn == -2){
    t = not();

    if(t != 1)
      r = 0;

    semn = factor();
  }
  if(semn == -3) ///Aici l am peticit pe cazul in care ne vine OR in loc de AND. Frumos? Nu. Functional? Sa speram!
    si -= SPACESOR;

  return r;
}

int or(){
  int r,t;

  r = and();
  while (factor() == -3){
    t = and();

    if(t == 1)
      r = 1;
  }

  return r;
}

int main(){
  int n,i;
  char c;
  FILE *fin, *fout;

  fin = fopen("bool.in","r");
  si = 0;
  s[0] = fgetc(fin);

  while(s[si]!='\n'){
    si ++;
    s[si] = fgetc(fin);
  }

  sl = si;
  si = 0;

  fscanf(fin,"%d",&n);
  fout = fopen("bool.out","w");

  fgetc(fin);
  for(i=0;i<n;i++){
    c = fgetc(fin);
    v[c-'A'] = 1- v[c - 'A'];

    fprintf(fout,"%d",or());
    si = 0;
  }

  fprintf(fout,"\n");

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