Problema: 2587
Linguagens: C e C++
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 "_".
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