Pesquisar este blog

Livros Recomendados

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

quarta-feira, 24 de fevereiro de 2021

URI (BEECROWD) - 1828 - Bazinga! - Iniciante - C e C++

Bazinga! Não, não estou falando da série de TV e do Sheldon, mas de um problema de programação que leva este nome. Brincadeiras à parte, confira nesse post a solução para este problema!

Plataforma: URI (BEECROWD)

Problema1828

Enunciado:

No oitavo episodio da segunda temporada do seriado The Big Bang Theory, The Lizard-Spock Expansion, Sheldon e Raj discutem qual dos dois é o melhor: o filme Saturn 3 ou a série Deep Space 9. A sugestão de Raj para a resolução do impasse é uma disputa de Pedra-Papel-Tesoura. Contudo, Sheldon argumenta que, se as partes envolvidas se conhecem, entre 75% e 80% das disputas de Pedra-Papel-Tesoura terminam empatadas, e então sugere o Pedra-Papel-Tesoura-Lagarto-Spock.

As regras do jogo proposto são:

a tesoura corta o papel;

o papel embrulha a pedra;

a pedra esmaga o lagarto;

o lagarto envenena Spock;

Spock destrói a tesoura;

a tesoura decapita o lagarto;

o lagarto come o papel;

o papel contesta Spock;

Spock vaporiza a pedra;

a pedra quebra a tesoura.

Embora a situação não se resolva no episódio (ambos escolhem Spock, resultando em um empate), não é difıcil deduzir o que aconteceria se a disputa continuasse. Caso Sheldon vencesse, ele se deleitaria com a vitória, exclamando "Bazinga!"; caso Raj vencesse, ele concluiria que "Raj trapaceou!"; caso o resultado fosse empate, ele exigiria nova partida: "De novo!". Conhecidas as personagens do jogo escolhido por ambos, faça um programa que imprima a provável reação de Sheldon.

Linguagens: C e C++

Solução:

Código em C:

Bastava testar todas as condições para a vitória de cada um ou empate. Mapeei as possibilidades com valores entre 0 e 2, inclusive, colocando isso numa variável chamada resultado. Com base no valor desta variável, então a respectiva resposta é exibida. Você pode estar estranhando a comparação que fiz utilizando, por exemplo, raj[0]. Isso foi feito para não precisar testar a string inteira, assumindo que as entradas seguem o padrão esperado. Na vida real, o ideal seria comparar as strings completas, ok?

#include <stdio.h>
int main() {

    int testes, contador = 1, resultado;
    char *sheldon = (char *) malloc(sizeof(char) * 7), *raj = (char *) malloc(sizeof(char) * 7);
    scanf("%i ", &testes);
    while (contador <= testes) {
        scanf("%s %s", sheldon, raj);
        resultado = 0;
        if (sheldon[0] == raj[0]) {
            if (raj[0] != 'p' || (sheldon[1] == raj[1] && raj[0] == 'p'))
                resultado = 1;
            if (sheldon[0] == 'p' && sheldon[1] == 'e' && raj[0] == 'p' && raj[1] == 'a')
                resultado = 2;
        }
        else {
            if (sheldon[0] == 't' && (raj[0] == 'S' || (raj[0] == 'p' && raj[1] == 'e')))
                resultado = 2;
            else if (sheldon[0] == 'S' && (raj[0] == 'l' || (raj[0] == 'p' && raj[1] == 'a')))
                resultado = 2;
            else if (sheldon[0] == 'l' && (raj[0] == 't' || (raj[0] == 'p' && raj[1] == 'e')))
                resultado = 2;
            else if (sheldon[0] == 'p' && sheldon[1] == 'e' && (raj[0] == 'S'))
                resultado = 2;
            else if (sheldon[0] == 'p' && sheldon[1] == 'a' && (raj[0] == 't' || raj[0] == 'l'))
                resultado = 2;
        }
        if (resultado < 1)
            printf("Caso #%i: Bazinga!\n", contador);
        else if (resultado > 1)
            printf("Caso #%i: Raj trapaceou!\n", contador);
        else
            printf("Caso #%i: De novo!\n", contador);
        contador++;
    }
    return 0;
}

Código em C++:

Idêntico ao código em C, seguindo a mesma lógica.

#include <iostream>
using namespace std;
int main() {
    int testes, contador = 1, resultado;
    string sheldon, raj;
    cin >> testes;
    while (contador <= testes) {
        cin >> sheldon >> raj;
        resultado = 0;
        if (sheldon[0] == raj[0]) {
            if (raj[0] != 'p' || (sheldon[1] == raj[1] && raj[0] == 'p'))
                resultado = 1;
            if (sheldon[0] == 'p' && sheldon[1] == 'e' && raj[0] == 'p' && raj[1] == 'a')
                resultado = 2;
        }
        else {
            if (sheldon[0] == 't' && (raj[0] == 'S' || (raj[0] == 'p' && raj[1] == 'e')))
                resultado = 2;
            else if (sheldon[0] == 'S' && (raj[0] == 'l' || (raj[0] == 'p' && raj[1] == 'a')))
                resultado = 2;
            else if (sheldon[0] == 'l' && (raj[0] == 't' || (raj[0] == 'p' && raj[1] == 'e')))
                resultado = 2;
            else if (sheldon[0] == 'p' && sheldon[1] == 'e' && (raj[0] == 'S'))
                resultado = 2;
            else if (sheldon[0] == 'p' && sheldon[1] == 'a' && (raj[0] == 't' || raj[0] == 'l'))
                resultado = 2;
        }
        if (resultado < 1)
            cout << "Caso #" << contador << ": Bazinga!" << endl;
        else if (resultado > 1)
            cout << "Caso #" << contador << ": Raj trapaceou!" << endl;
        else
            cout << "Caso #" << contador << ": De novo!" << endl;
        contador++;
    }
    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