Pesquisar este blog

Livros Recomendados

quarta-feira, 24 de fevereiro de 2021

URI (BEECROWD) - 1848 - Corvo Contador - Iniciante - C e C++

Corvo Contador resolvido e postado pra vocês! Espero que as soluções aqui oferecidas sejam úteis :) Valeu!

Plataforma: URI (BEECROWD)

Problema1848

Enunciado:

Como se sabe, existe um corvo com três olhos. O que não se sabia é que o corvo com três olhos pode prever o resultado da loteria de Westeros. Enquanto todos os outros corvos coletam as apostas, o corvo de três olhos já sabe o resultado, e quando Bran sonha com o corvo, o corvo conta o resultado. O problema é que Bran apesar de lembrar do sonho, não consegue interpretá-lo sozinho em tempo hábil. A sua tarefa é fazer um programa para interpretar o sonho de Bran e calcular o resultado da loteria. Durante o sonho, o corvo pisca diversas vezes e grita apenas 3 vezes. A cada grito um número do resultado da loteria é calculado. Cada piscada do corvo comunica um número em binário. Um olho aberto significa 1 e um olho fechado significa 0. O olho da esquerda é o mais significativo e o da direita é o menos significativo. A cada piscada, este número deve ser somado, e quando o corvo grita, essa soma é um resultado.

Linguagens: C e C++

Solução:

Código em C:

Aqui testei se "linha" recebia caw (na verdade, testei apenas o primeiro caractere, assumindo que as entradas estariam dentro do padrão -- o correto seria comparar a string inteira). Neste caso era só imprimir o acumulador e zerá-lo. Caso não fosse "caw", seria necessário testar os caracteres e saber se são asteriscos para incrementar o acumulador com valores em potência de base 2. O valor mais à direita vale 2^0, ou um, depois 2^1, ou dois, depois 2^2, ou quatro. Era só acumular este valor.

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

int main() {
    int acumulador = 0;
    char *linha = (char *) malloc(sizeof(char) * 8);
    
    while (gets(linha) != NULL) {
        if (linha[0] == 'c') {
            printf("%i\n", acumulador);
            acumulador = 0;
        }
        
        else {
            if (linha[0] == '*')
                acumulador += 4;
            if (linha[1] == '*')
                acumulador += 2;
            if (linha[2] == '*')
                acumulador++;
        }
    }
    return 0;
}

Código em C++:

Aqui segui uma lógica parecida, mas testei a string inteira, não apenas o primeiro caractere (a letra 'c').

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
using namespace std;
 
int main() {
    string str;
    int sum = 0;
    while(cin >> str){
    	if(str=="caw"){
    		cin >> str;
    		cout << sum << endl;
    		sum = 0;
    	}
    	else{
    		if(str[0]=='*') sum = sum+4;
    		if(str[1]=='*') sum = sum+2;
    		if(str[2]=='*') sum = sum+1;
    	}
    }
    
    return 0;
}

Solução alternativa em C++:

Solução com a mesma lógica que a do código em C.

#include <iostream>

using namespace std;

int main() {
    int acumulador = 0;
    string linha;
    
    while (getline(cin, linha)) {
        if (linha[0] == 'c') {
            cout << acumulador << endl;
            acumulador = 0;
        }
        
        else {
            if (linha[0] == '*')
                acumulador += 4;
            if (linha[1] == '*')
                acumulador += 2;
            if (linha[2] == '*')
                acumulador++;
        }
    }
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas