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)
Problema: 2031
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; }
#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; }