Hoje trago a vocês um problema da categoria Strings! O nome do problema é Pedra-papel-tesoura-lagarto-Spock. Bora conferir as soluções?
Problema: 1873
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:
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++
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; }
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; }