Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- /*
- *
- */
- int quantidade=0;
- char fonte[100000000];
- char destino[100000000];
- int contador(char vetor[], int i)
- {
- int conta_parenteses=0;
- int posicao=i;
- if(vetor[posicao]=='(')
- {
- conta_parenteses++;
- while(conta_parenteses!=0)
- {
- posicao++;
- if(vetor[posicao]=='(')
- {
- conta_parenteses++;
- }
- if(vetor[posicao]==')')
- {
- conta_parenteses--;
- }
- }
- }
- return posicao;
- }
- // I a => a
- void RegraI(char *inicio, char *fim)
- {
- int posicao=contador(inicio,1);
- memmove(fim,inicio+1,posicao);
- memmove(fim+posicao,inicio+(posicao+1),strlen(inicio));
- }
- // C a b c => a c b
- void RegraC( char *inicio, char *fim)
- {
- int quant= strlen(inicio);
- int pos_f= contador(inicio,1);
- int pos_x= contador(inicio,pos_f+1);
- int pos_y= contador(inicio, pos_x+1);
- int resto=0;
- int quant_resto=0;
- if(pos_y+1!=quant-1)
- {
- quant_resto= quant- (pos_y+1);
- resto=pos_y+1;
- }
- int quan_x=pos_x-pos_f;
- int quan_y=pos_y-pos_x;
- quant=quan_x+quan_y+pos_f+ quant_resto;
- memmove(fim,inicio+1,pos_f);
- memmove(fim+pos_f,inicio+(pos_x+1),quan_y);
- memmove(fim+(pos_f+quan_y),inicio+(pos_f+1),quan_x);
- memmove(fim+(pos_f+quan_y+quan_x),inicio+resto,strlen(inicio));
- }
- // B a b c => a (bc)
- void RegraB(char *inicio, char*fim)
- {
- int quant= strlen(inicio);
- int pos_f= contador(inicio,1);
- int pos_g= contador(inicio,pos_f+1);
- int pos_x= contador(inicio, pos_g+1);
- int quant_resto=0;
- int resto=0;
- if(pos_x+1!=quant-1)
- {
- quant_resto=quant -(pos_x+1);
- resto=pos_x+1;
- }
- int quan_x=pos_x-pos_g;
- int quan_g=pos_g-pos_f;
- quant=quan_x+quan_g+pos_f+ quant_resto+2;
- memmove(fim,inicio+1,pos_f);
- fim[pos_f]='(';
- memmove(fim+(pos_f+1),inicio+(pos_f+1),quan_g);
- memmove(fim+(pos_f+1+quan_g),inicio+(pos_g+1),quan_x);
- fim[pos_f+1+quan_g+quan_x]=')';
- memmove(fim+(pos_f+1+quan_x+quan_g+1),inicio+resto,strlen(inicio));
- }
- //regra S' renomeada a b c d => a (bd)(cd)
- void RegraQ(char *inicio, char *fim)
- {
- int quant= strlen(inicio);
- int pos_a= contador(inicio,1);
- int pos_b= contador(inicio,pos_a+1);
- int pos_c= contador(inicio, pos_b+1);
- int pos_d= contador(inicio, pos_c+1);
- int resto=0;
- int quan_resto=0;
- if(pos_d+1!=quant-1)
- {
- quan_resto=(quant)- (pos_d+1);
- resto=pos_d+1;
- }
- int quan_b=pos_b-pos_a;
- int quan_c=pos_c-pos_b;
- int quan_d=pos_d-pos_c;
- //a b c d => a (bd)(cd)
- quant=quan_c+quan_b+pos_a+ quan_resto+quan_d+4+quan_c+quan_d;
- memmove(fim, inicio+1,pos_a);
- fim[pos_a]='(';
- memmove(fim+(pos_a+1),inicio+(pos_a+1),quan_b);
- memmove(fim+(pos_a+1+quan_b),inicio+(pos_c+1),quan_d);
- fim[pos_a+1+quan_b+quan_d]=')';
- fim[pos_a+1+quan_b+quan_d+1]='(';
- memmove(fim+(pos_a+1+quan_b+quan_d+2),inicio+(pos_b+1),quan_c);
- memmove(fim+(pos_a+1+quan_b+quan_d+2+quan_c),inicio+(pos_c+1),quan_d);
- fim[pos_a+1+quan_b+quan_d+2+quan_c+quan_d]=')';
- memmove(fim+(pos_a+1+quan_b+quan_d+2+quan_c+quan_d+2),inicio+resto,strlen(inicio));
- /*
- for(i=0;i<=quant;i++){
- if(i<pos_a){
- destino[i]=vetor[j];
- }
- else if (i==pos_a) destino[i]='(';
- else if(i<pos_a+quan_b+1) {
- destino[i]=vetor[con_b];
- con_b++;
- }
- else if(i<pos_a+quan_b+quan_d+1) {
- destino[i]=vetor[con_d];
- con_d++;
- }
- else if(i==pos_a+quan_b+quan_d+1){
- destino[i]=')';
- con_c=pos_b+1;
- con_d=pos_c+1;
- }
- else if(i==pos_a+quan_b+quan_d+2){
- destino[i]='(';
- }
- else if(i<=pos_a+quan_b+quan_d+2+quan_c){
- destino[i]=vetor[con_c];
- con_c++;
- }
- else if(i<=pos_a+quan_b+quan_d+2+quan_c+quan_d){
- destino[i]=vetor[con_d];
- con_d++;
- }
- else if(i==pos_a+quan_b+quan_d+2+quan_c+quan_d+1){
- destino[i]=')';
- }
- else{
- if(resto!=0){
- destino[i]=vetor[resto];
- resto++;
- }
- }
- j++;
- }
- destino[quant+1]='\0';
- */
- }
- //regra B' renomeada a b c d => a b (c d)
- void RegraW (char *inicio, char *fim)
- {
- int quant= strlen(inicio);
- int pos_a= contador(inicio,1);
- int pos_b= contador(inicio,pos_a+1);
- int pos_c= contador(inicio, pos_b+1);
- int pos_d= contador(inicio, pos_c+1);
- int resto=0;
- int quan_resto=0;
- if(pos_d+1!=quant-1)
- {
- quan_resto=(quant)- (pos_d+1);
- resto=pos_d+1;
- }
- int quan_b=pos_b-pos_a;
- int quan_c=pos_c-pos_b;
- int quan_d=pos_d-pos_c;
- quant=quan_c+quan_b+pos_a+ quan_resto+quan_d+2;
- // a b c d => a b (c d)
- memmove(fim, inicio+1,pos_a);
- memmove(fim+pos_a,inicio+(pos_a+1),quan_b);
- fim[pos_a+quan_b]='(';
- memmove(fim+(pos_a+quan_b+1),inicio+(pos_b+1),quan_c);
- memmove(fim+(pos_a+quan_b+1+quan_c),inicio+(pos_c+1),quan_d);
- fim[pos_a+quan_b+1+quan_c+1]=')';
- memmove(fim+(pos_a+quan_b+1+quan_c+2),inicio+resto,strlen(inicio));
- /*
- for(i=0;i<=quant;i++){
- if(i<pos_a){
- destino[i]=vetor[j];
- }
- else if(i<pos_a+quan_b) {
- destino[i]=vetor[con_b];
- con_b++;
- }
- else if(i==pos_a+quan_b){
- destino[i]='(';
- }
- else if(i<=pos_a+quan_b+quan_c) {
- destino[i]=vetor[con_c];
- con_c++;
- }
- else if(i<=pos_a+quan_b+quan_c+quan_d){
- destino[i]=vetor[con_d];
- con_d++;
- }
- else if(i==pos_a+quan_b+quan_d+quan_c+1){
- destino[i]=')';
- }
- else{
- if(resto!=0){
- destino[i]=vetor[resto];
- resto++;
- }
- }
- j++;
- }
- destino[quant+1]='\0';
- */
- }
- //C’ a b c d => a (b d) c
- void RegraE (char *inicio, char*fim)
- {
- int quant= strlen(inicio);
- int pos_a= contador(inicio,1);
- int pos_b= contador(inicio,pos_a+1);
- int pos_c= contador(inicio, pos_b+1);
- int pos_d= contador(inicio, pos_c+1);
- int resto=0;
- int quan_resto=0;
- if(pos_d+1!=quant-1)
- {
- quan_resto=(quant)- (pos_d+1);
- resto=pos_d+1;
- }
- int i;
- int j=1;
- int con_b=pos_a+1;
- int con_c=pos_b+1;
- int con_d=pos_c+1;
- int quan_b=pos_b-pos_a;
- int quan_c=pos_c-pos_b;
- int quan_d=pos_d-pos_c;
- quant=quan_c+quan_b+pos_a+ quan_resto+quan_d+2;
- //C’ a b c d => a (b d) c
- memmove(fim,inicio+1,pos_a);
- fim[pos_a]='(';
- memmove(fim+(pos_a+1),inicio+(pos_a+1),quan_b);
- memmove(fim+(pos_a+1+quan_b),inicio+(pos_c+1),quan_d);
- fim[pos_a+1+quan_b+quan_d]=')';
- memmove(fim+(pos_a+1+quan_b+quan_d+1),inicio+(pos_b+1),quan_c);
- memmove(fim+(pos_a+1+quan_b+quan_d+1+quan_c),inicio+resto,strlen(inicio));
- /*
- for(i=0;i<=quant;i++){
- if(i<pos_a){
- destino[i]=vetor[j];
- }
- else if(i==pos_a){
- destino[i]='(';
- }
- else if(i<=pos_a+quan_b) {
- destino[i]=vetor[con_b];
- con_b++;
- }
- else if(i<=pos_a+quan_b+quan_d) {
- destino[i]=vetor[con_d];
- con_d++;
- }
- else if(i==pos_a+quan_b+quan_d+1){
- destino[i]=')';
- }
- else if(i<=pos_a+quan_b+quan_c+quan_d+1){
- destino[i]=vetor[con_c];
- con_c++;
- }
- else{
- if(resto!=0){
- destino[i]=vetor[resto];
- resto++;
- }
- }
- j++;
- }
- destino[quant+1]='\0';
- */
- }
- //K a b => a
- void RegraK(char *inicio, char *fim)
- {
- int quant= strlen(inicio);
- int pos_a= contador(inicio,1);
- int pos_b= contador(inicio,pos_a+1);
- int quant_resto=0;
- int resto=0;
- if(pos_b+1!=quant-1)
- {
- quant_resto=quant -(pos_b+1);
- resto=pos_b+1;
- }
- int i;
- int j=1;
- int con_a=pos_a+1;
- int con_b=pos_b+1;
- int quan_b=pos_b-pos_a;
- quant=quan_b+pos_a+ quant_resto;
- if(pos_a!=0 &&quan_b!=0)
- {
- memmove(fim,inicio+1,pos_a);
- memmove(fim+pos_a,inicio+resto,strlen(inicio));
- }
- else
- {
- quantidade=1;
- }
- }
- //S a b c => ac(bc)
- void RegraS(char *inicio, char*fim)
- {
- int quant= strlen(inicio);
- int pos_a= contador(inicio,1);
- int pos_b= contador(inicio,pos_a+1);
- int pos_c= contador(inicio, pos_b+1);
- int quant_resto=0;
- int resto=0;
- if(pos_c+1!=quant-1)
- {
- quant_resto=quant -(pos_c+1);
- resto=pos_c+1;
- }
- int i;
- int j=1;
- int con_b=pos_a+1;
- int con_c=pos_b+1;
- int quan_b=pos_b-pos_a;
- int quan_c=pos_c-pos_b;
- quant=quan_b+quan_c+pos_a+ quant_resto+2+quan_c;
- if(pos_a!=0 &&quan_b!=0&&quan_c!=0)
- {
- memmove(fim,inicio+1,pos_a);
- memmove(fim+pos_a,inicio+(pos_b+1),quan_c);
- fim[pos_a+quan_c]='(';
- memmove(fim+(pos_a+quan_c+1),inicio+pos_a+1,quan_b);
- memmove(fim+(pos_a+quan_b+quan_c+1) ,inicio+(pos_b+1),quan_c);
- fim[pos_a+quan_b+quan_c+1+quan_c]=')';
- memmove(fim+(pos_a+quan_b+quan_c+1+quan_c+1),inicio+resto,strlen(inicio));
- }
- else
- {
- quantidade=1;
- }
- }
- void eliminar_parenteses(char *vetor,char *fvetor)
- {
- int abreparenteses=0;
- int i,t;
- i=0;
- t=1;
- if(vetor[0]=='(')
- {
- abreparenteses++;
- while(abreparenteses!=0)
- {
- if(vetor[t]==')')
- {
- abreparenteses--;
- }
- if(vetor[t]=='(')
- {
- abreparenteses++;
- }
- if(abreparenteses!=0)
- {
- i++;
- t++;
- }
- }
- }
- t++;
- memmove(fvetor,vetor+1,i);
- memmove(fvetor+i,vetor+t,strlen(vetor));
- }
- int main(int argc, char** argv)
- {
- char * build_pattern(int n, char *input)
- {
- char y[] ="Q(EBI(SII))I(B(EBI(SII))I)";
- int y_len = 77;
- int pattern_length = 0;
- int pattern_size = 6;
- if (n > 0)
- {
- pattern_size += 6 * (n - 1);
- }
- char *pattern = (char*)malloc(pattern_size * sizeof(char*)); /* Aloca��o do padr�o (ATEN��O TAMANHO)
- //int input_size = ((pattern_size - n) + (n*y_len) + 1) * n * n;
- //char *input = (char*) malloc(input_size * sizeof(char)); // Aloca��o de entrada (ATEN��O TAMANHO)*/
- int i,j;
- for (i = 0; i < n; i++)
- {
- pattern[pattern_length++] = 'Y';
- pattern[pattern_length++] = '(';
- pattern[pattern_length++] = '(';
- }
- pattern[pattern_length++] = 'Y';
- pattern[pattern_length++] = '(';
- pattern[pattern_length++] = 'K';
- pattern[pattern_length++] = 'K';
- pattern[pattern_length++] = ')';
- for ( i = 0; i < n; i++)
- {
- pattern[pattern_length++] = ')';
- pattern[pattern_length++] = 'K';
- pattern[pattern_length++] = ')';
- }
- pattern[pattern_length++] = '\0';
- int i_length = 0;
- for (i = 0; i < pattern_length; i++)
- {
- char cur_char = pattern[i];
- if (cur_char == 'Y')
- {
- for (j = 0; j < y_len; j++)
- {
- input[i_length++] = y[j];
- }
- }
- else
- {
- input[i_length++] = cur_char;
- }
- }
- input[i_length++] = '\0';
- free(pattern);
- pattern = NULL;
- return input;
- }
- int n=1;
- build_pattern(n, fonte);
- build_pattern(n, destino);
- char *F=fonte;
- char*D=destino;
- char *auxiliar;
- clock_t inicio= clock();
- while(quantidade!=1)
- {
- printf("\n Fonte: %s", F);
- printf("\n Destino: %s",D);
- switch(F[0])
- {
- case '(':
- {
- eliminar_parenteses(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'K':
- {
- RegraK(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'S':
- {
- RegraS(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'I':
- {
- RegraI(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'B':
- {
- RegraB(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'C':
- {
- RegraC(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'E':
- {
- RegraE(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'Q':
- {
- RegraQ(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- case 'W':
- {
- RegraW(F,D);
- if(quantidade!=1)
- {
- auxiliar=F;
- F=D;
- D=auxiliar;
- }
- break;
- }
- default:
- quantidade=1;
- }
- }
- clock_t fina= clock();
- double fim=((fina-inicio)/CLOCKS_PER_SEC);
- printf(" destino: %s \n", D);
- printf("\n Tempo %1f s\n", fim);
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement