Pesquisar este blog

Livros Recomendados

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

quarta-feira, 3 de março de 2021

URI (BEECROWD) - 2031 - Pedra, Papel, Ataque Aéreo - Iniciante - C e C++

Fala, pessoal! Tudo numa boa? Resolvi aqui o problema "Pedra, Papel, Ataque Aéreo" e estou compartilhando as respostas com vocês. Bom proveito!

Plataforma: URI (BEECROWD)

Problema2031

Enunciado:

Pedra, Papel, Ataque Aéreo é um jogo infantil muito popular, em que duas ou mais crianças formam um círculo e fazem gestos com a mão na tentativa de obter a vitória. As regras são surpreendentemente complexas para um jogo de crianças, mas mesmo assim é bastante popular por todo o mundo.

As partidas são muito simples. Os jogadores podem escolher entre o sinal de uma Pedra (o punho), o sinal de um Papel (a palma aberta), e o sinal para o Ataque Aéreo (igual o do Papel, mas com apenas o polegar e o mindinho estendidos).

Uma partida, com dois jogadores, possuem as seguintes regras para se definir um vencedor:

Ataque Aéreo vs. Pedra: Neste caso, o jogador com o Ataque Aéreo derrota o jogador com a Pedra, por razões óbvias.

Pedra vs. Papel: Neste caso, o jogador com a Pedra derrota o com Papel, porque a Pedra machuca muito mais.

Papel vs. Ataque Aéreo: Aqui o Ataque Aéreo ganha, porque Ataque Aéreo sempre ganha e o Papel é patético.

Papel vs. Papel: Nesta variação, ambos os jogadores ganham, porque o Papel é inútil e ninguém que enfrenta o Papel pode perder.

Pedra vs. Pedra: Para este caso não há ganhador, porque depende do que os jogadores decidem fazer com a Pedra e normalmente não fazem nada.

Ataque Aéreo vs. Ataque Aéreo: Quando isto acontece, todos os jogadores perdem, devido a Aniquilação Mútua.

Sua tarefa é escrever um programa que, dada as escolhas de dois jogadores, informe quem venceu o jogo.

Linguagens: C e C++


Solução:

Alguns acharão estranho. Nesta solução, o ideal seria comparar o texto completo (por exemplo, "ataque" ou "papel"). Em vez disso, assumindo que a entrada estará sempre entre aquelas aguardadas, testei só o segundo caractere de cada palavra, pois este caractere é diferente em todas elas. Basicamente criei todas as condições para saber cada caso de vitória e imprimi a saída respectiva. Nos dois códigos abaixo eu utilizei essa lógica. Confira!

Código em C:

#include <stdio.h>

int main() {
    int n;
    char *jogador1 = (char *) malloc(sizeof(char) * 8);
    char *jogador2 = (char *) malloc(sizeof(char) * 8);
    
    scanf("%i ", &n);
    
    while (n--) {
        
        scanf("%s ", jogador1);
        scanf("%s ", jogador2);
        
        if (jogador1[1] == 'a' && jogador2[1] == 'a')
            printf("Ambos venceram\n");
            
        else if (jogador1[1] == 't' && jogador2[1] == 't')
            printf("Aniquilacao mutua\n");
            
        else if (jogador1[1] == 'e' && jogador2[1] == 'e')
            printf("Sem ganhador\n");
        
        else if ((jogador1[1] == 't' && jogador2[1] == 'e')
             || (jogador1[1] == 'e' && jogador2[1] == 'a')
             || (jogador1[1] == 't' && jogador2[1] == 'a'))
            printf("Jogador 1 venceu\n");
            
        else
            printf("Jogador 2 venceu\n");
        
    }

    return 0;
}

Código em C++:

#include <iostream>
using namespace std;

int main() {
    int n;
    string jogador1, jogador2;
    
    cin >> n;
    cin.ignore();
    
    while (n--) {
        
        getline(cin, jogador1);
        getline(cin, jogador2);
        
        if (jogador1[1] == 'a' && jogador2[1] == 'a')
            cout << "Ambos venceram" << endl;
            
        else if (jogador1[1] == 't' && jogador2[1] == 't')
            cout << "Aniquilacao mutua" << endl;
            
        else if (jogador1[1] == 'e' && jogador2[1] == 'e')
            cout << "Sem ganhador" << endl;
        
        else if ((jogador1[1] == 't' && jogador2[1] == 'e')
             || (jogador1[1] == 'e' && jogador2[1] == 'a')
             || (jogador1[1] == 't' && jogador2[1] == 'a'))
            cout << "Jogador 1 venceu" << endl;
            
        else
            cout << "Jogador 2 venceu" << 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