Cod sursa(job #2149889)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 3 martie 2018 02:04:47
Problema Bool Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char s[1001];
int val[26];
int p = 0;

int AND();
int OR();
int NR();

int OR() {
    int x = AND();
    p++;
    while ( s[p] == 'O' ) {
        p += 3;
        x = ( x || AND() );
        p++;
    }
    return x;
}

int AND() {
    int x = NR();
    p++;
    while ( s[p] == 'A' ) {
        p += 4;
        x = ( x && NR() );
        p++;
    }
    return x;
}

int NR() {
    int x, no = 0;
    while ( s[p] == 'N' && s[p + 1] == 'O' ) {
        p += 4;
        no = 1 - no;
    }
    if ( s[p] == '(' ) {
        p++;
        x = OR();
        p++;
    } else if ( s[p] == 'T' && s[p + 1] == 'R' ) {
        p += 4;
        x = 1;
    } else if ( s[p] == 'F' && s[p + 1] == 'A' ) {
        p += 5;
        x = 0;
    } else {
        x = val[s[p] - 'A'];
        p++;
    }
    return ( x + no ) % 2;
}

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