La casa de papel
ProgramaciónUso de condicionales y arrays
Me enteré de que habían asaltado La Fábrica Nacional de Moneda y Timbre por la televisión. Por lo visto los nombres de los presuntos atracadores eran capitales y ciudades del mundo: Tokio, Río, Berlín, Moscú… una idea curiosa, oye.
Al poco, recibí un pequeño encargo:
Querida Ada, nos estamos haciendo un lío con los nombres de los atracadores que no te imaginas. Necesitamos que crees un programa que, dada una capital indique si se trata de uno de los nombres elegidos por El Profesor para alguno de los miembros de su equipo o no.
Necesitamos tenerlo para dentro de 10 días… ¡hay demasiados rehenes en juego!
La propuesta no podía ser más fácil, ¿verdad? Pues apareció Edu volando y comenzó a atiborrarme a preguntas:
¿Lo vas a hacer con ifs anidados o encadenados? ¿o con un solo if? ¿sabes que hasta podías hacerlo con un switch? ¿y que puedes agrupar varias opciones en una? Se me está ocurriendo una idea mejor… ¿estás pensando lo mismo que yo?
Pues nada, que me puse manos a la obra barajando todas las opciones que me comentó Edu. ¡Cualquiera lo aguanta si no!
¿Os animáis a hacerlo conmigo? ¡Dejad vuestras dudas en los comentarios! 😉
Aquí os dejo enlaces al material que os vendrá bien repasar. ¡Ánimo!
Javascript – #1.19. Condicionales. Sentencia if-else
Javascript – #1.20. Condicionales. Sentencia switch
Javascript – #1.11. Operadores lógicos
Javascript – #1.09. Operadores de cadena
¿Tú cómo lo harías? ¡Deja tus ideas en los comentarios!
Y si quieres compartir código, te recomiendo que utilices alguna herramienta online de testing de código como Codepen, JSFiddle, PlayCode, etc. o repositorios como GitHub, GitLab, BitBucket…
Jesús Martínez Méndez says
Estoy ansioso de ampliar mis conocimientos
didacticode says
¡Así me gusta, Jesús, esa es la actitud! Espero estar a la altura… 🙂
neilhenao@gmail.com says
Hola, Maravilloso este espacio. Gracias
didacticode says
¡¡Gracias a ti por estar por aquí, Neil!! 🙂
Leonardo Tulian says
function DetectorDeDelincuentes(nombre ){
let mensaje;
if( nombre ===’Tokio’ || nombre === ‘Río’ || nombre ===’ Berlín’ || nombre === ‘Moscú’ ) mensaje = ‘Nombre de Delicuente’
else mensaje = ‘Nombre de Capital’;
return mensaje;
};
didacticode says
¡Hola, Leonardo! ¡Buen trabajo! Es una de las ideas que barajaba 😉
Veamos si hay más ideas por ahí… ¡un saludo!
Ada Lovecode says
Mmmmmm… creo que esa opción no funciona, Valentín…
neilhenao@gmail.com says
var nombre = prompt(“Por favor digite un nombre”);
switch(nombre) {
case ‘berlin’:
document.write(nombre + “: es un personaje de la serie.”);
break;
case ‘tokio’:
document.write(nombre + “: es un personaje de la serie.”);
break;
case ‘moscu’:
document.write(nombre + “: es un personaje de la serie.”);
break;
default:
document.write(nombre + “: NO es un personaje de la serie.”);
break;
}
José Acuña says
‘use strict’;
realizarPregunta();
/**
* https://didacticode.com/reto-la-casa-de-papel/
*
* @return void
*/
function realizarPregunta() {
let respuesta = prompt(‘¿Nombre de la capital?’);
if (respuesta === null) {
alert(‘Has decidido no responder.’);
} else {
respuesta = respuesta.trim();
if (respuesta.length === 0 || respuesta === ”) {
alert(‘Debes proporcionar el nombre de la capital.’);
} else {
if (esMiembroEquipo(respuesta)) {
alert(capitalizarNombreMiembro(respuesta) + ‘ es miembro del equipo :-)’);
} else {
alert(capitalizar(respuesta) + ‘ no es miembro del equipo :-(‘);
}
}
}
}
/**
* Determina si una capital dada es uno de los nombres elegidos por El Profesor
* para alguno de los miembros de su equipo.
*
* @param string capital
* El nombre de la capital.
*
* @return boolean
*/
function esMiembroEquipo(capital) {
if (typeof capital !== ‘string’) {
throw ‘El par\u00e1metro \’capital\’ de la funci\u00f3n \’esMiembroEquipo\’, debe ser de tipo cadena.’;
}
capital = eliminarDiacriticos(capital.toLowerCase().trim());
if (capital.length === 0 || capital === ”) {
throw ‘El par\u00e1metro \’capital\’ de la funci\u00f3n \’esMiembroEquipo\’, no puede estar en blanco.’;
}
let esMiembro = false;
switch (capital) {
case ‘tokio’:
case ‘rio’:
case ‘berlin’:
case ‘moscu’:
esMiembro = true;
break;
}
return esMiembro;
}
/**
* Elimina los diacríticos de un texto (ES6).
*
* @param string texto
* Texto a normalizar.
*
* @return string
*/
function eliminarDiacriticos(texto) {
if (typeof texto !== ‘string’) {
throw ‘El par\u00e1metro \’texto\’ de la funci\u00f3n \’eliminarDiacriticos\’, debe ser de tipo cadena.’;
}
return texto.normalize(‘NFD’).replace(/[\u0300-\u036f]/g, ”);
}
/**
* Capitaliza una palabra.
*
* @param string texto
* Palabra a ser capitalizada.
*
* @return string
*/
function capitalizar(texto) {
if (typeof texto !== ‘string’) {
throw ‘El par\u00e1metro \’texto\’ de la funci\u00f3n \’capitalizar\’, debe ser de tipo cadena.’;
}
return texto.substr(0, 1).toUpperCase() + texto.substr(1, texto.length);
}
/**
* Devuelve el nombre de la capital miembro; capitalizado y con acentos
* diacríticos si los tuviere.
*
* @param string capital
* El nombre de la capital.
*
* @return string
*/
function capitalizarNombreMiembro(capital) {
if (typeof capital !== ‘string’) {
throw ‘El par\u00e1metro \’capital\’ de la funci\u00f3n \’capitalizarNombreMiembro\’, debe ser de tipo cadena.’;
}
capital = eliminarDiacriticos(capital.toLowerCase().trim());
if (capital.length === 0 || capital === ”) {
throw ‘El par\u00e1metro \’capital\’ de la funci\u00f3n \’capitalizarNombreMiembro\’, no puede estar en blanco.’;
}
let nombre = ”;
switch (capital) {
case ‘tokio’:
nombre = ‘Tokio’;
break;
case ‘rio’:
nombre = ‘Río’;
break;
case ‘berlin’:
nombre = ‘Berlín’;
break;
case ‘moscu’:
nombre = ‘Moscú’;
break;
}
return nombre;
}
Ada Lovecode says
Por cierto, junto con la respuesta (cuando la publique) me encantaría dejar un enlace a tu snippet. ¡Si me lo permites! 🙂
José Acuña says
El caracter » debe ser remplazado por dos comillas simples para que el código se ejecute correctamente.
José Acuña says
Los caracteres ‘ y ’ también, deben ser remplazados por una comilla simple para que el código se ejecute correctamente.
José Acuña says
Este es el enlace al código fuente en GitLab.
https://gitlab.com/snippets/1970429
Merce says
Scanner teclado= new Scanner(System.in);
String[] nombres={“Berlin”,”Tokio”,”Río”,”Berlín”,”Moscú”};
System.out.print(“Introduce un nombre: “);
String nombre = teclado.nextLine();
boolean delincuente = false;
for (String nom : nombres) {
if(nombre.equals(nom)){
delincuente=true;
break;
}
}
if(delincuente){
System.out.println(“Nombre de delincuente”);
}else{
System.out.println(“Nombre de capital”);
}
Ada Lovecode says
¡Buen trabajo, Neil! ¿Crees que se puede reducir el código? 😉
La semana que viene te lo cuento, jejeje.
Ada Lovecode says
¡Me quito el sombrero, José!
Modularizado, con JSDoc, validaciones… se nota que trabajas en esto 😉
¡Gracias por tu propuesta!
Ada Lovecode says
¡Ea, qué buena, Merce! Con Java y utilizando un array. ¡Buena idea!
Manuel says
const atracadores = [‘tokio’,’río’,’rio’,’berlín’,’berlin’,’moscú’,’moscu’];
function revisaAtracadores(nombre){
for(var i of atracadores){
if(i == nombre.toLowerCase()){
return true;
}
}
return false;
}
Valentin says
No es un código para nada útil, si se requiere agregar mas nombres. Pero mi objetivo es que sea lo mas corto posible.
let nombre = prompt(‘Ingrese el nombre’);
if (nombre === (‘Tokio’ || ‘Río’ || ‘Berlín’||’Moscú’)) {
alert(‘Pertenece al grupo’);
}else{
alert(‘No pertenece al grupo’);
}
Ada Lovecode says
¡Hola, Jackie!
Me encantan los comentarios de tu código: “Opción larga y aburrida”, jejeje.
Yo no he tenido en cuenta la validación (que es super importante, ojo) y me he centrado en la algoritmia de la comprobación… con 10 propuestas, entre ellas, las tuyas.
Así que echa un ojo… ¡a ver si te convence alguna más que la tuya! 😉
PD. Veo tus 10 líneas y bajo a 8, jejeje.
Álvaro Ortiz Pedroso says
var capital = prompt(“Introduce la capital para descubrir si es un atracador: “);
var array = [“Tokio”, “Rio”, “Berlin”, “Moscu”]; // Array que contiene todos los nombres de los atracadores
var esAtracador = false;
for (i = 0; i < array.length; i++) {
if (capital == array[i]) {
esAtracador = true;
}
}
if (esAtracador) {
alert("Atracador");
} else {
alert("Pais")
}
Dev010101 says
Hola Ada, gracias por hacerme pensar xD dejo lo que se me ocurrió, solo aplico condicionales a algunas partes…
let capital = “Paris”;
//Construtor de atracadores
function Atracador(nombre,alias){
this.nombre = nombre;
this.alias = alias;
}
//creacion de atracadores
let atracador1 = new Atracador(“John Smith”,”Tokio”);
let atracador2 = new Atracador(“Laura Torrealba”,”Viena”);
let atracador3 = new Atracador(“Mario Jimenez”,”Seul”);
//atracadores en una matriz para facilitar el recorrido
let atracadoresArray = [atracador1,atracador2,atracador3];
//busca atracador segun el alias (capital)
function buscarAtracador(capital){
let tam = atracadoresArray.length;
for(let i = 0; i < tam; i++){
if(atracadoresArray[i].alias === capital){
return 1;
}
}
return -1;
}
//muestra resultado
if(buscarAtracador(capital) === 1){
console.log("Si esta");
}else{
console.log("No esta");
}
Saludos
Dev010101 says
Hola, te falto asociar el nombre del delincuente al alias de cada uno
Valentin says
El if lo podrías poner asi: if (nombre === (‘Tokio’ || ‘Río’ || ‘Berlín’||’Moscú’))
Ada Lovecode says
¡Bien pensado, Álvaro! Recuerda que Javascript también ofrece algún método para comprobar si un elemento está en un array, jejeje 😉
Ada Lovecode says
¡Así me gusta, con const! 🙂 ¡Muy buena, Manuel! Otra para la propuesta 😉
Ada Lovecode says
¡Buen intento, Dev010101!
En principio no necesitamos asociar el atracador al nombre, que podría ser una vuelta de tuerca. Tomo nota 😉
En la resolución veremos las alternativas que podemos seguir y cuáles pueden ser las mejores… aunque no hay solución mala (solo menos eficiente 😉
¡Nos vemos en el siguiente!
Ada Lovecode says
¡Hola, Valentín! Directo y al grano 🙂
Hombre, los nombres los vas a tener que añadir sí o sí en este o en cualquiera (no tenemos en cuenta ficheros, bases de datos ni nada parecido). ¡Así que no está nada mal! Otro para la saca 😉
Rafael García says
Buenas noches, yo para simplificar optaría por:
– Crear el array con los nombres
– Compararía con array.indexOf(nombreIntroducido) === -1
Llamadme clásico 😛
Luis Fernando says
Solucion en C++ para N delincuentes y M posibles delincuentes a evaluar:
int main(){
set delincuentes;
int numero_de_delincuentes;
cin >> numero_de_delincuentes;
for(int i = 0; i > nombre;
delincuentes.insert(nombre);
}
int numero_de_posibles_delincuentes;
cin >> numero_de_posibles_delincuentes;
for(int i = 0; i > nombre_a_evaluar;
cout << nombre_a_evaluar << " ";
(delincuentes.count(nombre_a_evaluar)) ? cout << "es delincuente" : cout << "es ciudad";
}
return 0;
}
Ada Lovecode says
¡Me uno a tu propuesta, Rafael! De hecho, es de mis favoritas 😉
Ada Lovecode says
¡Hombre, una respuesta en C++! ¡Bienvenida sea! 🙂
Nestor says
Te contesto desde un movil por eso no te mando el código pero mi respuesta lo haría parecida a la de rafa pero con array.include() . Seria lo más sencillo
Return [Nombres_asaltantes].include(nombre_buscado)
Saludos
Ada Lovecode says
¡Efectivamente, Néstor! Para mi, la opción “estrella”… ¡ya lo veréis en la resolución!
PD. Por cierto, sería “includes”, no “include” 😉
¡Buena propuesta! ¡Mil gracias!
Jackie says
Veo un poco de todo por aquí… y para traer más variedad al asunto te dejo aquí un enlace al repositorio de GitHub:
https://github.com/Jackie1430/LaCasicaDePapel
He añadido al ejercicio un “validador” para obligar al usuario a responder contenido adecuado a la pregunta, eliminando la posibilidad de que responda con espacios en blanco o cosas similares.
Un saludo Ada 😉
Ada Lovecode says
¡Jejeje! ¡Hecho! 😉
Alejandro Almonacid says
Yo lo hice de esta forma
https://github.com/alealmonacid/Reto-1-La-Casa-de-Papel-I
https://alealmonacid.github.io/Reto-1-La-Casa-de-Papel-I/
Me gustó el resultado
didacticode says
¡Buen trabajo, Alejandro! No solo lo has resuelto sino que además, lo has puesto “bonito”. Me gusta tu manera de resolverlo con una función flecha y, por supuesto, el operador ternario, que es de mis favoritos.
¡Sigue así y gracias por compartir!