ETAPA 3 – FINAL

Desafio 1 – BatMacumba

Enunciado
Resolução

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int canta(int size, char *string)
{
    char novaString[255];

    novaString[size] = '\0';
    strncpy(novaString, string, size);

    printf("%s\n", novaString);

    for (int i = size - 1; i >= 0; i--)
    {
        char l = string[i];
        if (l == 'a' || l == 'e' || l == 'i' || l == 'o' || l == 'u' || l == '\0')
        {
            continue;
        }
        if (i > 0)
        {
            if (string[i - 1] == ' ')
            {
                canta(i - 1, string);
            }
            else
            {
                canta(i, string);
            }
            printf("%s\n", novaString);
        }
        break;
    }
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {

        char string[255];

        scanf("\n%[^\n]", string);

        canta(strlen(string), string);
    }

    return 0;
}

Desafio 2 – DADINHO É O C$%&#

Enunciado
Resolução

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int mapa[6][6];
int posX;
int posY;

double hipotenusa(int cat1, int cat2) {
  return sqrt(pow(cat1, 2) + pow(cat2, 2));
}

void horaDaFuga() {
  double menorDist = 7;
  int inimigo = -1;

  for (int i = 0; i < 6; i++) {
    for (int j = 0; j < 6; j++) {
      if (mapa[i][j] == 1 || mapa[i][j] == 0) {
        continue;
      } else if (i == posY) {
        int dist = abs(j - posX);
        if (dist <= menorDist) {
          if (dist == menorDist) {
            if (mapa[i][j] > inimigo) {
              inimigo = mapa[i][j];
            }
          } else {
            inimigo = mapa[i][j];
          }
          menorDist = dist;
        }
      } else if (j == posX) {
        int dist = abs(i - posY);
        if (dist <= menorDist) {
          if (dist == menorDist) {
            if (mapa[i][j] > inimigo) {
              inimigo = mapa[i][j];
            }
          } else {
            inimigo = mapa[i][j];
          }
          menorDist = dist;
        }
      } else {
        int distX = abs(j - posX);
        int distY = abs(i - posY);
        double dist = hipotenusa(distX, distY);

        if (dist <= menorDist) {
          if (dist == menorDist) {
            if (mapa[i][j] > inimigo) {
              inimigo = mapa[i][j];
            }
          } else {
            inimigo = mapa[i][j];
          }
          menorDist = dist;
        }
      }
    }
  }

  if (inimigo != -1) {
    printf("Vou correr poque senao uns ");
    switch (inimigo) {
    case 2:
      printf("Policia");
      break;

    case 3:
      printf("Fumaca");
      break;
    case 4:
      printf("Quero-Quero");
      break;
    case 5:
      printf("Gesonel");
      break;
    }
    printf(" me pega, estao a %.2lfkm.", menorDist);
  }

  int i = posX + 1;

  while (i <= 6) {
    if (i == 6) {
      printf(" Vazei pro Rio e nunca mais voltei.\n");
      break;
    }

    if (mapa[posY][i] != 0) {
      if (mapa[posY][i] == 2) {
        printf(" Eu so quero eh ser feliz, andar tranquilamente na favela em "
               "que eu nasci.\n");
        break;
      } else if (mapa[posY][i] == 3) {
        printf(" cof cof, isso ta pior que churrasco em apartamento.\n");
        break;
      } else if (mapa[posY][i] == 4) {
        printf(" Aaah por que tem tanto Quero-Quero nesse lugar.\n");
        break;
      } else if (mapa[posY][i] == 5) {
        printf(" Volta pro teu desafio meu nobre, tem que salvar a terra.\n");
        break;
      }
    }

    i++;
  }
}

int main() {
  int n;

  scanf("%d", &n);

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 6; j++) {
      for (int k = 0; k < 6; k++) {
        scanf("%d", &mapa[j][k]);

        if (mapa[j][k] == 1) {
          posY = j;
          posX = k;
        }
      }
    }
    horaDaFuga();
  }

  return 0;
}

Desafio 3 – Desordem Programada

Enunciado
Resolução

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

// definição de uma struct que representa cada programa
typedef struct {
  char nome[10];
  int prioridade;
  bool ehAnime;

} Programa;

void definirAtributos(Programa *p) {

  /* verificar nome do programa e definir prioridade com base:

      1 - Os Padrinhos M  - PadrinhosM
      2 - Bob Esponja     - BobE
      3 - Dragon Ball     - DragB         - eh anime
      4 - Caverna Do D.   - CavernaD
      5 - Hamtaro         - Hamtaro       - eh anime
      6 - Kim Possible    - KimP
      7 - Pica-Pau        - PicaP
      8 - Rugrats         - Rugrats
      9 - Beyblade        - BeyB          - eh anime
      10 - Digimon        - Digi          - eh anime
      11 - Luluzinha      - Lulu
      12 - X-men          - X-men
  */

  if (strcmp(p->nome, "PadrinhosM") == 0) {
    p->prioridade = 1;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "BobE") == 0) {
    p->prioridade = 2;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "DragB") == 0) {
    p->prioridade = 3;
    p->ehAnime = true;
  }

  else if (strcmp(p->nome, "CavernaD") == 0) {
    p->prioridade = 4;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "Hamtaro") == 0) {
    p->prioridade = 5;
    p->ehAnime = true;
  }

  else if (strcmp(p->nome, "KimP") == 0) {
    p->prioridade = 6;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "PicaP") == 0) {
    p->prioridade = 7;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "Rugrats") == 0) {
    p->prioridade = 8;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "BeyB") == 0) {
    p->prioridade = 9;
    p->ehAnime = true;
  }

  else if (strcmp(p->nome, "Digi") == 0) {
    p->prioridade = 10;
    p->ehAnime = true;
  }

  else if (strcmp(p->nome, "Lulu") == 0) {
    p->prioridade = 11;
    p->ehAnime = false;
  }

  else if (strcmp(p->nome, "X-men") == 0) {
    p->prioridade = 12;
    p->ehAnime = false;
  }
}

// Bubble Sort utilizado para ordenar a lista
void ordenaProgramacao(Programa *lista, int tamanho) {
  for (int i = 1; i < tamanho; i++) {

    for (int j = 0; j < tamanho - 1; j++) {

      if (lista[j].prioridade > lista[j + 1].prioridade) {
        Programa temp = lista[j];
        lista[j] = lista[j + 1];
        lista[j + 1] = temp;
      }
    }
  }
}

// funcao responsavel por imprimir toda a programacao
void imprimeProgramacao(Programa lista[], int tamanho) {
  for (int i = 0; i < tamanho; i++) {
    printf("%s ", lista[i].nome);
  }

  printf("\n");
}

// funcao responsavel por identificar proximo nao anime da programacao
int proximoNaoAnime(Programa lista[], int i, int tamanho) {
  int programasRestantes = tamanho - i;

  for (; programasRestantes != 0; programasRestantes--, i++) {
    if (lista[i].ehAnime == false)
      return i;
  }

  return -1;
}

void ordenaRepetido(Programa *lista, int tamanho) {
  int i, contAnime = 0;

  // iterar por toda a programacao
  for (i = 0; i < tamanho; i++) {

    // identifica se ha repetido
    if (lista[i].ehAnime == true) {
      contAnime++;
    } else {
      contAnime = 0;
    }

    // quando ha 3 animes repetidos, fazer modificacao na ordem
    if (contAnime == 3) {

      int proximo = proximoNaoAnime(lista, i, tamanho);
      if (proximo == -1)
        return;

      Programa aux = lista[i];
      lista[i] = lista[proximo];
      lista[proximo] = aux;

      contAnime = 0;
    }
  }
}

int main() {

  int casosTeste;
  scanf("%d", &casosTeste);
  int i;
  for (i = 0; i < casosTeste; i++) {

    // entrada da quant de programas
    int quantProgramas;
    scanf("%d", &quantProgramas);

    // criar lista em que ficara toda a programacao do dia
    Programa programacao[quantProgramas];

    // entrada dos programas + alimenta atributos da estrutura
    int j;
    for (j = 0; j < quantProgramas; j++) {
      Programa p;
      scanf("%s", (p.nome));
      definirAtributos(&p);
      programacao[j] = p;
    }

    // caso tenha poucos programas
    if (quantProgramas < 6) {
      printf("Soh isso? Tem crianca chorando\n");
    } else {
      // ordena com base na prioridade de cada programa
      ordenaProgramacao(programacao, quantProgramas);

      // ordena os animes repetidos
      ordenaRepetido(programacao, quantProgramas);

      imprimeProgramacao(programacao, quantProgramas);
    }
  }

  return 0;
}

Desafio 4 – João grilo cabra safado da peste

Enunciado

Resolução

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX 100

void obterPalavra(char** palavra) {
    char* buffer = (char*) malloc(MAX * sizeof(char));
    scanf("%s", buffer);
    *palavra = (char*) malloc(strnlen(buffer, strlen(buffer)) * sizeof(char));
    sprintf(*palavra, "%s", buffer);
} 

void adicionarPalavra(char** lista_palavras, int* tamanho_lista, char* palavra) {
    lista_palavras[*tamanho_lista] = palavra;
    (*tamanho_lista)++;
}

void removePonto(char** palavra) {
}

int numRepeticoes(char** lista_palavras, int tamanho_lista, char* palavra) {
    int counter = 0;
    for (int i = 0; i < tamanho_lista; i++)
    {
        char* c = lista_palavras[i];
        if(!strcmp(c, palavra))
            counter++;
    }
    return counter;
}

bool primoMenorQue80(int num) {
    int primos[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79};
    for (int i = 0; i < (sizeof(primos) / sizeof(int)); i++)
    {
        if(num == primos[i])
            return true;
    }
    return false;
}

bool verificarParada(char** lista_palavras, int tamanho_lista) {
    if (!strcmp(lista_palavras[tamanho_lista - 1], "mundo") &&
        !strcmp(lista_palavras[tamanho_lista - 2], "do") &&
        !strcmp(lista_palavras[tamanho_lista - 3], "inteligente") &&
        !strcmp(lista_palavras[tamanho_lista - 4], "mais") &&
        !strcmp(lista_palavras[tamanho_lista - 5], "Grilo") &&
        !strcmp(lista_palavras[tamanho_lista - 6], "o") &&
        !strcmp(lista_palavras[tamanho_lista - 7], "Acabousse")
        )
        return true;
    else
        return false;        
}

int main() {
    while(true) {
        char** lista_palavras = (char**) malloc(MAX * sizeof(char*));
        int tamanho_lista = 0;
        bool flag = true;

        while(flag) {
            char* palavra_atual;
            obterPalavra(&palavra_atual);
            
            if(palavra_atual[strlen(palavra_atual) - 1] == '.') {
                // removendo o ponto final
                // printf("%s %d\n", palavra_atual, (int) strlen(palavra_atual));
                strtok(palavra_atual, ".");
                // printf("%s %d\n", palavra_atual, (int) strlen(palavra_atual));
                flag = false;
            }
            adicionarPalavra(lista_palavras, &tamanho_lista, palavra_atual);
        }

        if(verificarParada(lista_palavras, tamanho_lista))
            break;

        // reutilizando a flag
        flag = false;

        for (int i = 0; i < tamanho_lista; i++)
        {
            // se o número de repetições de alguma palavra for primo e menor que 80, printar a frase e sair do loop
            if(primoMenorQue80(numRepeticoes(lista_palavras, tamanho_lista, lista_palavras[i]))) {
                printf("O amarelo mais amarelo que eu ja tive a honra de condenar!\n");
                flag = true;
                break;
            }
        }
        if(!flag)
            printf("Valha-me Nossa Senhora, Mae de Deus de Nazare!\n");
    }
    return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *