Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 3161. Mostrar todas as postagens
Mostrando postagens com marcador 3161. Mostrar todas as postagens

quarta-feira, 24 de março de 2021

URI (BEECROWD) - 3161 - As Frutas Esquecidas - Iniciante - C e C++

Plataforma: URI (BEECROWD)

Problema3161

Linguagens: C e C++

Enunciado:

Sheldon Cooper é um personagem excêntrico existente no universo de Hollywood. Recentemente ele sofreu um acidente e acabou esquecendo quais frutas gosta de comer. Contudo, é chegada a hora de preparar o café da manhã e Sheldon não quer passar pela experiência de provar uma fruta e descobrir que não gosta dela. Então, incomodado com essa situação, Sheldon convenceu seu amigo Leonard Hofstadter a lhe ajudar. Leonard lembra do momento que conheceu Sheldon e devido as excentricidades de seu amigo, ele guardou em seu computador uma lista com o nome das frutas que Sheldon gosta de comer. Leonard muito animado com sua sagacidade, abre o arquivo e observa que algo está errado: o conteúdo do arquivo foi embaralhado por um vírus de computador.

Determinado a resolve essa questão, Leonard fez experimentos e concluiu que é possível ler o conteúdo do arquivo e descobrir se Sheldon gosta ou não de uma dada fruta. Pelos experimentos, Leonard observou que o vírus fez alguma(s) das seguintes alterações: 1) Incluiu novos caracteres à esquerda e/ou à direita ao nome da fruta que estava na lista; 2) Alterou algumas letras, neste caso, algumas se tornaram maiúsculas e outras minúsculas; 3) O nome da fruta que estava na lista foi invertido ("Bergamota" => "Atomagreb"). Como Leonard estudou programação, ele irá criar um programa que recebe o nome de uma fruta e retorna se Sheldon gosta ou não dessa fruta.


Solução:

Código em C: confesso que essa solução não ficou tão legível! A ideia foi passar os valores lidos para letras minúsculas para facilitar a manipulação e colocá-los em uma matriz de char, enquanto outra matriz de char recebe os textos das linhas da lista de nomes. Estes valores foram manipulados para serem armazenados na ordem recebida e na ordem inversa, pois os nomes das frutas podem estar invertidos. Depois disso basta procurar em cada linha da matriz lista se há a fruta desejada, o que foi feito com strstr, da biblioteca string. A variável int lock fez o controle para saber quando a fruta é encontrada, podendo imprimir a resposta correta caso positivo e negativo.

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

#define TAM 110

int main() {
    int n, m, lock, i, j;
    char s[TAM], q[TAM], f[TAM], fruta[TAM][TAM], lista[TAM*5][TAM], temp[TAM], a[TAM];
    scanf("%d %d ", &n, &m);
    for (i = 0; i < n; i++) {
        fgets(s, TAM, stdin);
        for(j = 0; j < strlen(s)-1; j++)
            fruta[i][j] = tolower(s[j]);
    }
    for (i = 0; i < 2 * m; i++) {
        fgets(q, TAM, stdin);
        for(j = 0; j < strlen(q)-1; j++)
            lista[i][j] = tolower(q[j]);
        for(j = 0; j < strlen(q)-1; j++)
            temp[j] = tolower(q[strlen(q)-2-j]);
        temp[j] = '\0';
        strcpy(lista[++i], temp);
    }
    for (j = 0; j < n; j++) {
        strcpy(f, fruta[j]);
        lock = 0;
        for (i = 0; i < 2 * m; i++) {
            strcpy(a, lista[i]);
            if (strstr(a, f) != NULL && !lock)
                lock = 1;
        }
        if (lock)
            printf("Sheldon come a fruta %s\n", f);
        else
            printf("Sheldon detesta a fruta %s\n", f);
        
    }
    return 0;
}

Código em C++:

A solução em C++ ficou um pouco mais elegante. Utilizei dois vetores de strings, fruta e lista, e uma variável de controle (lock). Após per n e m, li cada string e transformei ela para letras minúsculas com a função transform, adicionando esta string resultante no vector fruta. Depois fiz o mesmo com a string q, adicionando no vetor lista, e também reverti ela e adicionei neste mesmo vetor. Após isso, procura-se por ocorrências de cada elemento do vector fruta no vector lista, pois o vírus pode ter revertido o texto original. A variável lock controla se Sheldon come a fruta e o resultado esperado é impresso em cada caso.

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    int n, m;
    string s, q, f;
    vector<string> fruta;
    vector<string> lista;
    bool lock;
    cin >> n >> m;
    cin.ignore();
    while (n--) {
        getline(cin, s);
        transform(s.begin(), s.end(), s.begin(), ::tolower);
        fruta.push_back(s);
    }
    while (m--) {
        getline(cin, q);
        transform(q.begin(), q.end(), q.begin(), ::tolower);
        lista.push_back(q);
        reverse(q.begin(), q.end());
        lista.push_back(q);
    }
    for (int j = 0; j < fruta.size(); j++) {
        f = fruta.at(j);
        lock = false;
        for (int i = 0; i < lista.size(); i++) {
            string a = lista.at(i);
            if (a.find(f) != std::string::npos && !lock) 
                lock = true;
        }
        if (lock)
            cout << "Sheldon come a fruta " << nouppercase << f << endl;
        else
            cout << "Sheldon detesta a fruta " << nouppercase<< f << endl;
        
    }
    return 0;
}

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