Solução Informática - Nível Iniciante - Semana 18

Solução por Anita Ramos

Este problema apresenta mais de uma solução, mas optei por explicar a que me pareceu mais simples por não exigir tanta manipulação com string ou char e sim mais com int, por mais que possa não ser a primeira ideia que surge para resolvê-lo.

A ideia consiste em cada palavra (pedra, papel, tesoura....) ter um número específico identificando-a. Esse número se baseia na primeira e na última letra de cada uma, já que não temos nenhuma palavra com essas duas letras iguais. Na verdade você poderia pegar qualquer par de letras (necessariamente 2 ou mais por conta das palavras "pedra" e "papel"), mas optei por essas. Para acessá-las, basta "chamar" o vetorchar[0] e o vetorchar[tamanho da palavra-1] (-1 já que começa com 0). Apenas lembrando que para saber o tamanho de um vetor de char temos a função strlen(). Depois apenas comparamos os números de identificação nesses 3 casos:

  • Se eles forem iguais, as palavras são iguais, ou seja, empate;
  • Se o lado esquerdo ganhar do direito, imprimi-se "Bazinga!"
  • Se o lado direito ganhar (nenhum dos casos anteriores), imprimi-se "Raj trapaceou!"

Para determinar se o lado esquerdo ganha, apenas uso um if() que checa se algum caso do lado esquerdo ganhar é verdade, sendo que cada palavra ganha de exatamente outras duas palavras. Exemplo: papel ganha da pedra e do Spock, ou seja, ganha de 2. Assim, eu apenas verifico todos os casos possíveis para cada palavra, totalizando 5 palavras -> 2 testes para cada = 10 opções possíveis.

Segue o código comentado para melhor compreensão da solução:

OBS: não se assuste com o seu tamanho, ele contém muitos comentários, mas o código em si é curto.


#include<bits/stdc++.h> //biblioteca utilizada
using namespace std;
int main()
{
int n,tam,a,b; //declaração das variáveis
char pal[2100], pal2[2100]; //vetor de char para ler as duas palavras de uma linha
scanf("%d", &n); //leitura do 'n'
for(int i=1; i<=n; i++) //loop para rodar todos os casos de teste
{
scanf(" %s %s", pal, pal2); //leitura das duas palavras
tam=strlen(pal); //'tam' recebe o tamanho da 1º palavra
a=pal[0]+pal[tam-1]; //'a' recebe a soma do valor da 1º letra e a última letra da 1º palavra baseado na tabela ASCII
tam=strlen(pal2); //'tam' recebe o tamanho da 2º palavra
b=pal2[0]+pal2[tam-1]; //'b' recebe a soma do valor da 1º letra e a última letra da 2º palavra baseado na tabela ASCII
printf("Caso #%d: ", i); //imprime a primeira linha da saída
if(a==b)printf("De novo!\n"); //se 'a' = 'b', as palavras são iguais, ou seja, empate (imprime "De novo!")
//se não for empate e o lado esquerdo ganha do direito (todos os casos possíveis), imprime "Bazinga!"
else if((a==220 && (b==209 || b==190)) || (a==219 && (b==220 || b==190)) || (a==213 && (b==220 || b==219)) || (a==209 && (b==219 || b==213)) || (a==190 && (b==209 || b==213)))printf("Bazinga!\n");
//se não for empate e o lado esquerdo não ganha (ou seja, lado direito ganha), imprime "Raj trapaceou!"
else printf("Raj trapaceou!\n");
}
return 0; //retorna a 0
}
/* Valores da soma da 1º e da última letra de cada palavra
papel 220
lagarto 219
tesoura 213
pedra 209
Spock 190*/

view raw

Bazinga!.cpp

hosted with ❤ by GitHub