Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nazscka en 3 Junio 2020, 22:49 pm



Título: Ayudaaa
Publicado por: nazscka en 3 Junio 2020, 22:49 pm
Me pidieron esto para una tarea y hace horas que trato de resolverlo sin encontrar resultado:

"Un grupo de pequeños amigos suele reunirse para jugar a los espías. Como pretenden imitar a los buenos espías, tienen sus medios para codificar mensajes. En particular, para informar a sus colegas si sus actividades de espionaje han dado resultado o no, han ideado el siguiente método. Los chicos tienen una hilera ‘base’ de letras del alfabeto internacional. Cuando quieren transmitirle a otro un mensaje indicando el resultado exitoso de su misión, envían por celular una palabra que sólo puede leerse en la hilera base de izquierda a derecha. Si la misión resultó fallida, mandan una palabra que en la hilera base sólo puede leerse al revés, es decir de derecha a izquierda. A veces necesitan avisar que la misión encomendada está demorada, por lo que no pueden usar el método anterior. En este caso mandan una palabra que no puede leerse en ningún sentido.

Para ayudar a los chicos, se te pide que escribas un programa mensajes.cpp que, recibiendo una palabra y teniendo la secuencia de letras ‘base’, decida si la palabra está o no, y en el primer caso en qué dirección se pudo leer."

Por ejemplo:
Entrada:
ABDLFJKDSHKHLIDFNMENSAJESJDSKFJSDFNISDFJDFSLKJDFSLDFS
MENSAJE

Salida:
SI
I

Entrada:
ABDLFJKDSHKHLIDFEJASNEMJDSKFJSDFNISDFJDFSLKJDFSLDFS
MENSAJE

Salida:
SI
D
Ejemplo

Entrada:
ABDLFJKDSHKHLIDFMENSAJEJDSKFJSDFNISDFJDFSLKJDFSLDFS
SECRETO

Salida:
NO

esto se lo que tengo hasta ahora, pero la función es un int, y debería ser un bool.

Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int Sepuedeleer (string base, string palabra){
  6. string base2;
  7. int ban;
  8.  
  9. for (int i= base.size(); i >=0 ; i--){
  10. base2+= base[i];
  11. }
  12.  
  13. if(base.find(palabra) !=base.npos){
  14. ban=1;
  15. }
  16.  
  17. if(base2.find(palabra) !=base.npos){
  18. ban=2;
  19. }
  20.  
  21. return ban;
  22. }
  23.  
  24. int main(){
  25. string base, palabra;
  26. int ban;
  27.  
  28. cout <<"Ingrese el mensaje: ";
  29. getline(cin, base);
  30.  
  31. cout <<"Ingrese la palabra clave: ";
  32. cin >>palabra;
  33.  
  34. ban= Sepuedeleer(base, palabra);
  35.  
  36. switch(ban){
  37.  
  38. case 0: cout <<"No" <<endl;
  39. break;
  40.  
  41. case 1: cout <<"Si" <<"\nI" <<endl;
  42. break;
  43.  
  44. case 2: cout <<"Si" <<"\nD" <<endl;
  45. break;
  46. }
  47.  
  48. return 0;
  49. }

Gracias de antemano


Título: Re: Ayudaaa
Publicado por: K-YreX en 4 Junio 2020, 10:19 am
Tienes que representar 3 estados por lo que si lo calculas todo dentro de la función no podrás usar como valor de retorno <bool>. Para poder usar un <bool> tienes que separar la lógica del problema, por ejemplo, haciendo una función que te devuelva true/false según si el mensaje está en la cadena o no y llamar a esta función dos veces, la segunda vez con la cadena invertida.

El resultado podría ser algo así:
Código
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. bool contieneMensaje(string cadena, string mensaje){
  8. size_t posicion = cadena.find(mensaje);
  9. return posicion != string::npos;
  10. }
  11.  
  12. int main(){
  13. string cadena = "ABDLFJKDSHKHLIDFNMENSAJESJDSKFJSDFNISDFJDFSLKJDFSLDFS";
  14. string mensaje = "MENSAJE";
  15. string direccion = "Derecha - Izquierda"; // Por defecto asumimos que la direccion es esa para solo cambiarla una vez
  16.  
  17. bool encontrado = contieneMensaje(cadena, mensaje);
  18.        // Si la cadena la encontramos a la primera, esta en la otra direccion
  19. if(encontrado) direccion = "Izquierda - Derecha";
  20. // Invertimos la cadena y volvemos a usar la funcion
  21. string cadenaInvertida = string(cadena.rbegin(), cadena.rend());
  22.        // Para que se guarde true tanto si lo era antes como si lo es ahora usamos un OR |.
  23. encontrado |= contieneMensaje(cadenaInvertida, mensaje); // Equivale a: encontrado = encontrado || contieneMensaje(...)
  24.  
  25. if(encontrado) cout << "Si" << endl << direccion << endl;
  26. else cout << "No" << endl;
  27. }