
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…
Estoy ansioso de ampliar mis conocimientos
¡Así me gusta, Jesús, esa es la actitud! Espero estar a la altura… 🙂
Hola, Maravilloso este espacio. Gracias
¡¡Gracias a ti por estar por aquí, Neil!! 🙂
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;
};
¡Hola, Leonardo! ¡Buen trabajo! Es una de las ideas que barajaba 😉
Veamos si hay más ideas por ahí… ¡un saludo!
Mmmmmm… creo que esa opción no funciona, Valentín…
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;
}
‘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;
}
Por cierto, junto con la respuesta (cuando la publique) me encantaría dejar un enlace a tu snippet. ¡Si me lo permites! 🙂
El caracter » debe ser remplazado por dos comillas simples para que el código se ejecute correctamente.
Los caracteres ‘ y ’ también, deben ser remplazados por una comilla simple para que el código se ejecute correctamente.
Este es el enlace al código fuente en GitLab.
https://gitlab.com/snippets/1970429
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”);
}
¡Buen trabajo, Neil! ¿Crees que se puede reducir el código? 😉
La semana que viene te lo cuento, jejeje.
¡Me quito el sombrero, José!
Modularizado, con JSDoc, validaciones… se nota que trabajas en esto 😉
¡Gracias por tu propuesta!
¡Ea, qué buena, Merce! Con Java y utilizando un array. ¡Buena idea!
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;
}
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’);
}
¡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.
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")
}
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
Hola, te falto asociar el nombre del delincuente al alias de cada uno
El if lo podrías poner asi: if (nombre === (‘Tokio’ || ‘Río’ || ‘Berlín’||’Moscú’))
¡Bien pensado, Álvaro! Recuerda que Javascript también ofrece algún método para comprobar si un elemento está en un array, jejeje 😉
¡Así me gusta, con const! 🙂 ¡Muy buena, Manuel! Otra para la propuesta 😉
¡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!
¡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 😉
Buenas noches, yo para simplificar optaría por:
– Crear el array con los nombres
– Compararía con array.indexOf(nombreIntroducido) === -1
Llamadme clásico 😛
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;
}
¡Me uno a tu propuesta, Rafael! De hecho, es de mis favoritas 😉
¡Hombre, una respuesta en C++! ¡Bienvenida sea! 🙂
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
¡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!
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 😉
¡Jejeje! ¡Hecho! 😉
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
¡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!