Pesquisar este blog

Livros Recomendados

domingo, 12 de abril de 2020

URI - 2587 - Jetiqui - Strings - C e C++

Plataforma: URI

Problema2587

Linguagens: C e C++

Soluções:

Basicamente o que este exercício pedia era se, dado um conjunto de duas palavras e uma palavra incompleta, seria possível dizer qual das duas palavras completas teria gerado a palavra incompleta. Não é necessário dizer qual, mas apenas se é possível dizer qual palavra gerou. 

Vou apresentar aqui três soluções que são aceitas neste exercício, sendo a primeira em C e as outras duas em C++.

Na minha solução em C, criei uma função getTam, que conta o tamanho de uma sequência de caracteres. Ela é similar à função strlen e foi utilizada aqui para evitar a inclusão da biblioteca string.h, apenas.

A solução envolve armazenar a posição do underlines para verificar as condições em que é possível encontrar a resposta. Caso não seja possível, o valor "N" será informado (ele já é atribuído à variável resposta dentro do loop).

#include <stdio.h>

#define TAM 16

size_t getTam(const char *str) {
    size_t len;
    for (len = 0; ; ++len)
        if (str[len] == 0)
            return len;
}

int main() {
    
    unsigned int n, p[2], i, k;
    scanf("%u ", &n);
    
    char s1[TAM], s2[TAM], s3[TAM], resposta;
    while (n--) {
        scanf("%s ", s1);
        scanf("%s ", s2);
        scanf("%s ", s3);
        resposta = 'N';
        
        for (i = 0, k = 0; i < getTam(s3); i++)
            if (s3[i] == '_')
                p[k++] = i;
        
        
        if (s1[p[0]] == s2[p[0]] && s1[p[1]] == s2[p[1]])
            resposta = 'Y';
        else if (s1[p[0]] == s2[p[1]] || s1[p[1]] == s2[p[0]])
            resposta = 'Y';
        
        printf("%c\n", resposta);
    }

    return 0;
}

A primeira solução em C++ envolve um array para armazenar a posição dos underlines e depois verificar as condições que possibilitam a descoberta da resposta, atribuindo "Y" à variável resposta. As condições poderia constar todas em um único if, mas resultaria em muitas condições, por isso foram quebradas em duas. Essa eu fiz um pouco diferente, não criei a minha getTam, mas usei o método size(), disponível para strings.

#include <iostream>

using namespace std;

int main() {
    
    int n, p[2];
    cin >> n;
    cin.ignore();
    
    string s1, s2, s3, resposta;
    while (n--) {
        getline(cin, s1);
        getline(cin, s2);
        getline(cin, s3);
        resposta = "N";
        
        for (int i = 0, k = 0; i < s3.size(); i++)
            if (s3[i] == '_')
                p[k++] = i;
        
        
        if (s1[p[0]] == s2[p[0]] && s1[p[1]] == s2[p[1]])
            resposta = "Y";
        else if (s1[p[0]] == s2[p[1]] || s1[p[1]] == s2[p[0]])
            resposta = "Y";
        
        cout << resposta << endl;
    }

    return 0;
}

A outra solução em C++ foi feita da seguinte maneira: após a leitura das três palavras, a terceira palavra (incomplete) é percorrida anotando as posições em que possui underline (ou seja, vazio). Estas posições são colocadas no vetor positions. Só pra deixar claro, underline é o caractere "_".

Após saber essas posições, elas são acessadas na word1 e word2. É verificado se a primeira posição na palavra 1 é igual a segunda posição na palavra 2 ou o inverso. Caso algum deles for positivo, então é impresso "Y", pois é possível descobrir a palavra em uma única rodada.

Em C++ a solução ficou assim:

 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
#include <iostream>
using namespace std;

int main(){
 int n;
 int posit[2];
 string word1, word2;
 string incomplete;
 cin >>n;
 while(n--){
  cin >> word1 >> word2;
  cin >> incomplete;
  int found = 0;
  for(int i=0; i < incomplete.size() or found < 2;i++){
   if(incomplete[i]=='_'){
    posit[found] = i;
    found++;
   }
  }
  if(word1[posit[0]]==word2[posit[1]] or word1[posit[1]]==word2[posit[0]]){
   cout << "Y" <<endl;
  }
  else{
   cout << "N" << 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