Resoluções da Etapa 1

Desafio 1 – X9

Enunciado
Resolução
#include <stdio.h>
#include <string.h>

char letra(char letra){
	switch(letra){
		case 'a':
			return 'r';
		
		case 'b':
			return 'x';
		
		case 'c':
			return '4';
			
		case 'd':
			return '7';
		
		case 'e':
			return 'z';
			
		case 'f':
			return 'i';
			
		case 'g':
			return 'n';
		
		case 'h':
			return 'y';
		
		case 'i':
			return '3';
		
		case 'j':
			return 'p';
			
		case 'k':
			return '9';
			
		case 'l':
			return 'b';
			
		case 'm':
			return '0';
		
		case 'n':
			return '1';
		
		case 'o':
			return 't';
		
		case 'p':
			return 'w';
		
		case 'q':
			return '2';
		
		case 'r':
			return 'v';
		
		case 's':
			return 'c';
		
		case 't':
			return '8';
		
		case 'u':
			return 'k';
		
		case 'v':
			return 'm';
		
		case 'w':
			return 'd';
		
		case 'x':
			return 'o';
		
		case 'y':
			return 'q';
		
		case 'z':
			return 'j';
		
		case '0':
			return 'e';
		
		case '1':
			return 'g';
		
		case '2':
			return '5';
		
		case '3':
			return 'l';
		
		case '4':
			return 'h';
		
		case '5':
			return 'f';
			
		case '6':
			return 's';
		
		case '7':
			return 'u';
		
		case '8':
			return 'a';
		
		case '9':
			return '6';
	
		default :
			return ' ';
	}
}

int main(){
		char a [1000] = {}, b[1000]={},res [1000]={};
	int n,ii;
	scanf("%i", &n);
	for(ii=0; ii<n; ii++){
		// limpando todas as entradas
		memset(a,0,strlen(a)); 
		memset(b,0,strlen(b));
		memset(res,0,strlen(res));

		scanf("%s", a);
		scanf ("%s", b);
		fflush(stdin);
		int i;
		int tois = 0;
		for (i=0; i<=strlen (b); i++){
			if (a[i] != b[i]){		 	//Verifica quais caracteres sao diferentes
				res[tois] = letra(b[i]); 	 	//faz a analise de qual é o char correspondente
				tois++;				 
			}
		}
	printf("%s\n", res);
	}
	return 0;
}

Desafio 2 – Treinamento de Kung Fu

Enunciado
Resolução
#include <stdio.h>

int main(){

    int n, m;
    scanf("%i", &n);
    scanf("%i", &m);

    int ent[m], saida[m], pares[m];
    int qntP;
    while(n--){
        qntP = 0;
        for(int i = 0; i < m; i++)
            scanf("%i", &ent[i]);

        for(int i = 0; i < m; i++){
            if(!(ent[i]%2)){
                saida[i] = ent[i]*i;
                pares[qntP] = ent[i];
                qntP++;
            }
            else{
                saida[i] = pares[qntP-1] + pares[qntP-2];
            }
        }
        for(int i = 0; i < m; i++){
            printf("%i", saida[i]);
            if(i < m-1)
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}

Desafio 3 – Pulando Prédios

Enunciado
Resolução
#include <stdio.h>
#include <malloc.h>
int achaTopoPredio(int ** tabela, int tam, int col);
int livreParaFrente(int ** tabela, int lin, int inicio, int fim);
int livreVertical(int ** tabela, int col, int inicio, int fim);

int main(){
    //variaveis
    int N, M, linha, j, coluna, topoDireita, topoEsquerda, colunaDireita, colunaEsqueda, maxPassos, passos;
    
    scanf("%i", &N);

    //alocando memória para o vetor já preenchendo os valores
    for(j = 0; j < N; j++){
        //tamanho do vetor quadratico
        scanf("%i", &M);
        //alocando memoria para os ponteiros das linhas do vetor
        int** tabela = (int **) malloc(sizeof(int*)*M);

        for(linha = 0; linha < M; linha++){
            //alocando memoria para o valor da coluna do vetor 
            tabela[linha] = (int*) malloc(sizeof(int)*M);
            for(coluna = 0; coluna < M; coluna++){
                //pegando valor da linha i na coluna k
                scanf("%i", &tabela[linha][coluna]);
            }
        }
        //pegando o poder de passos
        scanf("%i", &maxPassos);

        //O predio da direita sempre fica na ultima coluna do vetor, portanto M-1
        colunaDireita = M-1;
        //procura a posicao da linha do topo do predio da direita
        topoDireita = achaTopoPredio(tabela, M, colunaDireita);

        //iniciando a coluna do topo do predio a direita em 0, pois eh o caso mais comum.
        colunaEsqueda = 0;
        //loop para encontrar em qual coluna se encontra o topo do predio da esquerda
        while(colunaEsqueda < colunaDireita){
            topoEsquerda = achaTopoPredio(tabela, M, colunaEsqueda);
            //se encontrou o topo, para o loop 
            if(topoEsquerda != -1){
                break;
            }
            //do contrario vai para a proximo coluna
            colunaEsqueda++;
        }

        for(linha=topoDireita; linha >= 0; linha--){
            if(livreParaFrente(tabela, linha, topoDireita, 0)&&livreVertical(tabela, M-1, topoDireita, linha)&&livreVertical(tabela, 0, topoEsquerda, linha)){
                passos = (topoDireita-linha)+M-1+(topoEsquerda-linha);
                if(passos <= maxPassos){
                    printf("Pular predio eh moleza pra mim.\n");
                    break;
                }                
            }
        }
        //se o loop nao encontrou solucao nem na linha 0, entao linha sai do loop com valor -1
        //portanto, se a linha for negativa, o loop nao encontrou nenhuma solucao
        if(linha < 0){
            printf("Nao vai dar nao Morpheus.\n");
        }

        //liberando o espaco na memoria para proximo loop
        for(linha = 0; linha < M; linha++){
            for(coluna = 0; coluna<M; coluna++){
                free(tabela[linha][coluna]);
            }
        }

    }
}
int achaTopoPredio(int ** tabela, int tam, int col){
    int i = 0;
    //verifica todas as linhas do vetor do inicio ao fim da matriz (tam-1)
    //usa a coordenada da coluna passada por parametro
    for(int i = 0; i < tam; i++){
        if(tabela[i][col] == 1){
            return i;
        }
    }
    //deixando a baleira ser livre
    //"free uIae" "free willy"
    free(i);
    return -1;
}

int livreParaFrente(int ** tabela, int lin, int inicio, int fim){
    int i;
    //verifica todas as colunas do vetor do inicio ao fim
    //com a coordenada da linha passada por parametro
    for(i = inicio; i >= fim; i--){
        //se algum for obstaculo retorna falso 0
        if(tabela[lin][i] == 2){
            return 0;
        }
    }
    
    free(i);
    //se nao encontrou obstaculos do inicio ao fim retorna true 1
    return 1;
}

int livreVertical(int ** tabela, int col, int inicio, int fim){
    int i;
    //verifica todas as linhas do vetor do inicio ao fim
    //com a coordenada da coluna passada por parametro

    //se o inicio for maior que fim, entao vamos varrer de baixo para cima (subindo)
    if(inicio > fim){
        for(i = inicio; i >= fim; i--){
            if(tabela[i][col]==2){
                //se algum for obstaculo retorna falso 0
                return 0;
            }
        }
    }
    //do contrario, o inicio eh menor que o fim, entao vamos varrer de cima para baixo (descendo)
    else{

        for(i = inicio; i <= fim; i++){
            if(tabela[i][col]==2){
                //se algum for obstaculo retorna falso 0
                return 0;
            }
        }
    }
    free(i);
    return 1;
}

Desafio 4 – Passeio na Nabucodonosor

Enunciado

Resolução
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(){
    int n;
    scanf("%i\n", &n);
    int i;
    for(i=0; i<n; i++){
        char situacao[8];
        scanf("%[^\r\n]\n", situacao); //adicionar um \n no scanf para descer pro proximo caso - EXCLUSIVO PRO DJ.
        fflush(stdin); //limpeza de buffer

        int a = abs((situacao[0]-'0') - (situacao[4]-'0')); //distancia entre a posicao de linhas da lula 1 para lula 2
        int b = abs((situacao[2]-'0') - (situacao[6]-'0')); //distancia entre a posicao de colunas da lula 1 para lula 2

        if(situacao[4]-'0' == 3 || situacao[6]-'0' == 3 || situacao[0]-'0' == 3 || situacao[2]-'0' == 3 || //caso pelo menos uma delas esteja de cara para a nave
          (a != 6 && b != 6 && a !=0 && b != 0 && (abs(situacao[4]-'0' - 3) == 1 || abs(situacao[6]-'0' - 3) == 1) && //a e b != 0 e !=6 indica que nao estao nem em opostos nem indo pro mesmo lugar
          (abs(situacao[0]-'0' - 3) == 1 || abs(situacao[2]-'0' - 3) == 1))) //sendo a distancia = 1, pelo menos uma delas estah em area de advertencia, e se a e b != 0, entao nao da pra se esconder em nenhuma direcao                                                        
            printf("A casa caiu, Cleitinho! Soca PEM neles!\n");
        else{
            //se a distancia pra uma das lulas do cano eh 1 na posicao de linhas, se esconde da visao horizontal
            if(abs(situacao[4]-'0' - 3) == 1 || abs(situacao[0]-'0' - 3) == 1) 
                printf("Toca para vertical, Tank.\n");
            //se a distancia pra uma das lulas do cano eh 1 na posicao de colunas, se esconde da visao vertical
            else if(abs((situacao[6]-'0') - 3) == 1 || abs((situacao[2]-'0') - 3) == 1) 
                printf("Toca para horizontal, Tank.\n");
            //senao, ta tudo nice 😀
            else 
                printf("Barra limpa, timeee\n", situacao);
        }
    }
    return 0;
}

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *