Cod sursa(job #1724618)

Utilizator MickeyTurcu Gabriel Mickey Data 3 iulie 2016 17:24:24
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
#include<stdlib.h>
#include<stdio.h>
#include<fstream>
#include<string.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

char v[100], sc[110], vec[10000],temp[10000];
int l, i, n, k, ok, nr, p, val[200],len,x,le;

void clrprt()
{
	l = strlen(vec) - 1;
	for (i = 0; i <= l - 2; i++)
		if (vec[i] == '('&&vec[i + 2] == ')')
		{
			vec[i] = vec[i + 1];
			strcpy(vec + i + 1, vec + i + 3);
		}
}

void solveec()
{
	l = strlen(vec) - 1;
	for (i = 0; i <= l-1; i++)
		if (vec[i] == '&'&&(vec[i+1]=='0'||vec[i+1]=='1')&&(vec[i-1]=='0'||vec[i-1]=='1'))
		{
			vec[i - 1] = (vec[i + 1] - '0'&&vec[i-1]-'0')+'0';
			strcpy(vec + i, vec + i + 2);
			l = strlen(vec) - 1;
		}
		else
		if (vec[i] == '|' && (vec[i + 1] == '0' || vec[i + 1] == '1') && (vec[i - 1] == '0' || vec[i - 1] == '1'))
		{
			vec[i - 1] = (vec[i + 1] - '0'||vec[i - 1] - '0') + '0';
			strcpy(vec + i, vec + i + 2);
			l = strlen(vec) - 1;
		}
}

void clrnotaddval()
{
	l = strlen(vec) - 1;
	for (i = 0; i <= l; i++)
		if (vec[i] == '!'&& vec[i + 1] != '(')
		{
			if (val[vec[i + 1]] == 1)
				vec[i] = '0';
			else
				vec[i] = '1';
			strcpy(vec + i + 1, vec + i + 2);
		}
		else
			if (isalpha(vec[i]))
			{
				if (val[vec[i]] == 1)
					vec[i] = '1';
				else
					vec[i] = '0';
			}
}
int main()
{
	ifstream f("bool.in");
	ofstream g("bool.out");
	memset(val, 0, sizeof(val));
	i = 0;
	do
	{
		f >> v;
		if (strlen(v) == 1)
			vec[i++] = v[0];
		else
		{
			if (strcmp("AND", v) == 0)
				vec[i++] = '&';
			else
				if (strcmp("TRUE", v) == 0)
					vec[i++] = '1';
				else
					if (strcmp("FALSE", v) == 0)
						vec[i++] = '0';
					else
						if (strcmp("OR", v) == 0)
							vec[i++] = '|';
						else
							if (strcmp("NOT", v) == 0)
								vec[i++] = '!';
							else
							{
								strcpy(vec + i, v);
								i += strlen(v);
							}
		}
	} while (!isdigit(v[0]));
	p = 1;
	do
	{
		n = n + p*(vec[strlen(vec) - 1] - '0');
		p = p * 10;
		vec[strlen(vec) - 1] = '\0';
	} while (isdigit(vec[strlen(vec) - 1]));
	l = strlen(vec) - 1;
	le = l;
	for (i = 0; i <= l - 4; i++)
		if (vec[i] == 'T'&& vec[i + 1] == 'R'&& vec[i + 2] == 'U'&& vec[i + 3] == 'E')
		{
			strcpy(vec + i, vec + i + 3);
			vec[i] = '1';
		}
		else
			if (vec[i] == 'F'&& vec[i + 1] == 'A'&& vec[i + 2] == 'L'&& vec[i + 3] == 'S'&& vec[i + 4] == 'E')
			{
				strcpy(vec + i, vec + i + 4);
				vec[i] = '0';
			}
			else
				if (vec[i] == 'N'&& vec[i + 1] == 'O'&& vec[i + 2] == 'T')
				{
					strcpy(vec + i, vec + i + 2);
					vec[i] = '!';
				}
	for (k = 0; k <= le; k++)
		temp[k] = vec[k];
	f >> sc;
	len = strlen(sc) - 1;
	for (k = 0; k <= len; k++)
	{
		for (x = 0; x <= le; x++)
			vec[x] = temp[x];
		val[sc[k]] = !val[sc[k]];
		do
		{
			clrprt();
			clrnotaddval();
			solveec();
		} while (strlen(vec) != 1);
		g << vec;
	}
	return 0;
}