Pesquisar este blog

Livros Recomendados

sábado, 27 de fevereiro de 2021

URI (BEECROWD) - 1873 - Pedra-papel-tesoura-lagarto-Spock - Strings - C e C++

Hoje trago a vocês um problema da categoria Strings! O nome do problema é Pedra-papel-tesoura-lagarto-Spock. Bora conferir as soluções?

Plataforma: URI (BEECROWD)

Problema1873

Enunciado:
Pedra-papel-tesoura-lagarto-Spock é uma expansão do clássico método de seleção em jogo de pedra-papel-tesoura. Atua sob o mesmo princípio básico, mas inclui outras duas armas adicionais: o lagarto (formado pela mão igual a uma boca de fantoche) e Spock (formada pela saudação dos vulcanos em Star Trek). Isso reduz as chances de uma rodada terminar em um empate. O jogo foi inventado por Sam Kass e Karen Bryla, como "Rock Paper Scissors Lizard Spock". As regras de vantagem são as seguintes: 
Tesoura corta papel 
Papel cobre pedra 
Pedra derruba lagarto 
Lagarto adormece Spock 
Spock derrete tesoura 
Tesoura prende lagarto 
Lagarto come papel 
Papel refuta Spock 
Spock vaporiza pedra 
Pedra quebra tesoura 
Um dia, dois amigos, Rajesh e Sheldon, decidiram apostar quem pagaria um almoço para o outro, com esta brincadeira. Sua missão será fazer um algoritmo que, baseado no que eles escolherem, informe quem irá ganhar ou se dará empate.

Linguagens: C e C++

Solução:

Código em C:

Criei todas as comparações possíveis que dariam a vitória a rajesh. Caso a expressão lógica não seja satisfeita é sinal de que sheldon foi o vencedor. Há também a possibilidade de empate, quando ambos informam a mesma entrada. Isso é testado antes para evitar comparações desnecessárias.

#include <stdio.h>
#include <string.h>
int main() {
    int n;
    char str1[12], str2[12];
    scanf("%d ", &n);
    while (n--) {
        scanf("%s %s", str1, str2);
        if (!strcmp(str1,str2))
            printf("empate\n");
        else if ((!strcmp(str1, "tesoura") && !strcmp(str2, "papel"))
            || (!strcmp(str1, "papel") && !strcmp(str2, "pedra"))
            || (!strcmp(str1, "pedra") && !strcmp(str2, "lagarto"))
            || (!strcmp(str1, "lagarto") && !strcmp(str2, "spock"))
            || (!strcmp(str1, "spock") && !strcmp(str2, "tesoura"))
            || (!strcmp(str1, "tesoura") && !strcmp(str2, "lagarto"))
            || (!strcmp(str1, "lagarto") && !strcmp(str2, "papel"))
            || (!strcmp(str1, "papel") && !strcmp(str2, "spock"))
            || (!strcmp(str1, "spock") && !strcmp(str2, "pedra"))
            || (!strcmp(str1, "pedra") && !strcmp(str2, "tesoura")))
            printf("rajesh\n");
        else
            printf("sheldon\n");
    }
    return 0;
}

Código em C++:

Dois mapas são criados com as combinações que dão a vitória para Rajesh. Então, é verificado se as strings lidas são iguais, quando daria empate, ou se verificando a string 1 dentro de algum mapa se a string 2 é obtida, quando Rajesh venceria. Caso contrário, é dada a vitória para Sheldon.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <map>
 
using namespace std;

int main() {
 int n;
 string str1, str2;
 cin >> n;
 map<string,string> mymap;
 map<string,string> mymap2;
 mymap["tesoura"] = "papel";
 mymap["papel"] = "pedra";
 mymap["pedra"] = "lagarto";
 mymap["lagarto"] = "spock";
 mymap["spock"] = "tesoura";

 mymap2["tesoura"] = "lagarto";
 mymap2["lagarto"] = "papel";
 mymap2["papel"] = "spock";
 mymap2["spock"] = "pedra";
 mymap2["pedra"] = "tesoura";

 while(n--){
  cin >> str1 >> str2;
  if(str1==str2) cout << "empate"<< endl;
  else{
   if(mymap[str1]==str2 or mymap2[str1]==str2) 
    cout << "rajesh" << endl;
   else cout << "sheldon" << endl;
  }

 }
    return 0;
}

Solução alternativa: criam-se todas as possibilidades para que rajesh possa ganhar, e casos contrários resultarão na impressão de "sheldon" no bloco else. Essa solução é semelhante à solução apresentada em C.

#include <iostream>
#include <string>
using namespace std;
int main() {
    int n;
    string str1, str2;
    cin >> n;
    cin.ignore();
    while (n--) {
        cin >> str1 >> str2;
        if (!str1.compare(str2))
            cout << "empate" << endl;
        else if ((!str1.compare("tesoura") && !str2.compare("papel"))
            || (!str1.compare("papel") && !str2.compare("pedra"))
            || (!str1.compare("pedra") && !str2.compare("lagarto"))
            || (!str1.compare("lagarto") && !str2.compare("spock"))
            || (!str1.compare("spock") && !str2.compare("tesoura"))
            || (!str1.compare("tesoura") && !str2.compare("lagarto"))
            || (!str1.compare("lagarto") && !str2.compare("papel"))
            || (!str1.compare("papel") && !str2.compare("spock"))
            || (!str1.compare("spock") && !str2.compare("pedra"))
            || (!str1.compare("pedra") && !str2.compare("tesoura")))
            cout << "rajesh" << endl;
        else
            cout << "sheldon" << endl;
    }
    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