#include #include #include #define MAXLIN 2048 #define MAXPAL 100 /* Lê uma linha da entrada e retorna seu comprimento */ int lelinha(char *s) { return strlen(fgets(s, MAXLIN, stdin)); } /* pega uma PALAVRA */ char *pegapal(char *t, char *pal) { /* pula o que não for letra */ while (!isalpha(*t)) { if (*t == '\0') return NULL; printf("%c", *t++); } /* achei uma palavra */ *pal++ = *t++; /* copia o restante da palavra */ while (isalpha(*t)) *pal++ = *t++; /* final de string */ *pal = '\0'; /* retorna a posição atualizada do ponteiro */ return t; } /* seleciona o salto */ int Salto(int l) { static int Primos[] = {2,3,5,7,11,13,17,19,23,29,31,37,41}; int j=0; /* procura o primeiro primo */ while (j < 13 && (l%Primos[j] == 0)) j++; /* só pra garantir */ if (j >= 13) return l-1; return Primos[j]; } int main() { char texto[MAXLIN]; /* Linha do texto */ char pal[MAXPAL]; /* Uma palavra */ char bag[MAXPAL]; /* Palavra bagunçada */ char *t = texto; /* ponteiro auxiliar */ /* Pega uma linha */ lelinha(texto); /* percorre as palavras */ while ((t = pegapal(t,pal))) { /* pal tem uma palavra */ int i,j; int l = strlen(pal)-2; /* tamanho da mexida */ int jump = 1; /* para bagunçar */ if (l > 0) { /* tem o que mexer? */ /* escolhe o salto */ jump = Salto(l); /* posição da letra escolhida */ j = jump % l; /* percorre o miolo da palavra */ for (i = 0; i < l; i++ ) { bag[i+1] = pal[j+1]; j += jump; j %= l; } } /* copia início e fim */ bag[0] = pal[0]; bag[l+1] = pal[l+1]; /* \0 final */ bag[l+2] = '\0'; /* imprime a palavra bagunçada */ printf("%s", bag); } return 0; }