Cod sursa(job #794241)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 5 octombrie 2012 23:48:23
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb

#include <cstdio>
#include <iostream>

const int MAX_SIZE(1002);
const int MAX_MODIFY(102);

char expression [MAX_SIZE];
char modify [MAX_MODIFY];
bool values ['Z' + 1];

char *parser;

inline void read (void)
{
	std::freopen("bool.in","r",stdin);
	char *iterator(expression), c, *c_ptr(&c);
	while (c != '\n')
	{
		std::scanf("%c",c_ptr);
		if (c != ' ')
		{
			*iterator = c;
			++iterator;
		}
	}
	iterator = '\0';
	int x;
	std::scanf("%d\n%s",&x,modify);
	std::cerr << expression << '\n';
	std::cerr << modify << '\n';
	std::fclose(stdin);
}

bool priority1 (void);
bool priority2 (void);
bool priority3 (void);

bool priority1 (void)
{
	bool result(priority2());
	while (*parser == 'O' && parser[1] == 'R')
	{
		parser += 2;
		result |= priority2();
	}
	return result;
}

bool priority2 (void)
{
	bool result(priority3());
	while (*parser == 'A' && parser[1] == 'N')
	{
		parser += 3;
		result &= priority3();
	}
	return result;
}

bool priority3 (void)
{
	bool result;
	while (*parser == 'N' && parser[1] == 'O')
	{
		parser += 3;
		result = !priority3();
		return result;
	}
	if (*parser == '(')
	{
		++parser;
		result = priority1();
		++parser;
	}
	else
	{
		if (*parser == 'T' && parser[1] == 'R')
		{
			result = true;
			parser += 4;
		}
		else if (*parser == 'F' && parser[1] == 'A')
		{
			result = false;
			parser += 5;
		}
		else
		{
			result = values[*parser];
			++parser;
		}
	}
	return result;
}

inline void print (void)
{
	std::freopen("bool.out","w",stdout);
	for (char *iterator(modify) ; *iterator ; ++iterator)
	{
		values[*iterator] = !values[*iterator];
		parser = expression;
		if (priority1())
			std::putchar('1');
		else
			std::putchar('0');
	}
	std::putchar('\n');
	std::fclose(stdout);
}

int main (void)
{
	read();
	print();
	return 0;
}