Skip to content

Commit acdd774

Browse files
José Miguel Sánchez AlésJosé Miguel Sánchez Alés
authored andcommitted
Añade soluciones a los ejercicios medios de Javascript
1 parent 902bed4 commit acdd774

File tree

9 files changed

+440
-21
lines changed

9 files changed

+440
-21
lines changed

source/99.ejercicios/soluciones/JS/ejM02.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ function generarAleatorio(min, max) {
3737
*
3838
* @param {number} n - Número de dados en la tirada
3939
*
40-
* @yields {Array} - La puntuación de cada dado.
40+
* @yields {number} - La puntuación de cada dado.
4141
*/
42-
function* generarTirada(n) {
42+
function* generarPartida(n) {
4343
let tirada;
4444

4545
if(!Number.isInteger(n) || n < 1) {
@@ -57,12 +57,12 @@ function* generarTirada(n) {
5757

5858
// Programa principal
5959

60-
const partida = generarTirada(numDados);
61-
let dados, intentos = 0;
60+
const partida = generarPartida(numDados);
61+
let tirada, intentos = 0;
6262

63-
for(dados of partida) {
63+
for(tirada of partida) {
6464
intentos++;
65-
console.log(`Resultado de la ${intentos}ª tirada: ${dados}.`);
65+
console.log(`Resultado de la ${intentos}ª tirada: ${tirada.join("-")}.`);
6666
}
6767

68-
console.log(`Se han tardado ${intentos} tandas en sacar todo ${dados[0]} simultáneamente.`);
68+
console.log(`Se han tardado ${intentos} tiradas en sacar ${tirada.join("-")}.`);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* @file Obtener a partir de un número el resultante de invertir
3+
* todas sus cifras.
4+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
5+
*/
6+
7+
/**
8+
* Controla si se genera una entrada alteatoria o no.
9+
* @type {boolean}
10+
*/
11+
const aleatorio = true;
12+
13+
/**
14+
* Límite inferior predefinido para generar aleatorios.
15+
* @type {number}
16+
*/
17+
const MIN = 10,
18+
/**
19+
* Límite superior predefinido para generar aleatorios.
20+
* @type {number}
21+
*/
22+
MAX = 9999999;
23+
24+
/**
25+
* Número predeterminado
26+
* @type {number}
27+
*/
28+
const NUMERO = 123;
29+
30+
31+
/**
32+
* Genera un entero aleatorio entre un límite inferior
33+
* y un límite superior
34+
*
35+
* @param {number} min - El límite inferior.
36+
* @param {number} max - El límite superior.
37+
*
38+
* @example
39+
* generarAleatorio(0, 10); // Entero entre 0 y 10 (ambos inclusive)
40+
*
41+
* @returns {number} - El entero aleatorio.
42+
*/
43+
function generarAleatorio(min, max) {
44+
return Math.round(Math.random()*(max - min)) + min;
45+
}
46+
47+
/**
48+
* Calcula el número resultante de invertir de orden
49+
* las cifras del número original.
50+
* @param {number} n - El número original.
51+
*
52+
* @returns {number} - El número invertido.
53+
*/
54+
function invertirNumero(n) {
55+
return Number(Array.from(String(n)).reverse().join(''));
56+
}
57+
58+
59+
const numero = aleatorio?generarAleatorio(MIN, MAX):NUMERO;
60+
console.log(`La inversión de ${numero} es ${invertirNumero(numero)}.`);

source/99.ejercicios/soluciones/JS/ejM06.js

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@
55

66
/**
77
* Calibres existentes.
8-
* @type {Array}
8+
* @type {String[]}
99
*/
1010
const CALIBRES = ["1", "2", "3"],
1111
/**
1212
* Tipos de uva.
13-
* @type {Array}
13+
* @type {String[]}
1414
*/
1515
VARIEDADES = ["tempranillo", "palomino", "moscatel"];
1616

17+
/**
18+
* Precisión de la moneda.
19+
* @type {number}
20+
*/
21+
const precision = 2;
22+
1723
/**
1824
* Genera un número aleatorio entre un límite inferior
1925
* y un límite superior
@@ -32,26 +38,53 @@ function generarAleatorio(min, max) {
3238
* En un programa serio posiblemente debería leerse la entrada desde
3339
* un documento JSON.
3440
*
35-
* @return {Object} - Los precios y cantidades de cada uva.
41+
* La entrada tendrá el siguiente formato:
42+
*
43+
* [
44+
* {
45+
* variedad: "tempranillo",
46+
* calibres: [
47+
* {
48+
* nombre: "1",
49+
* precio: 1.24,
50+
* cantidad: 100
51+
* },
52+
* {
53+
* nombre: "3",
54+
* precio: 1.89,
55+
* cantidad: 67
56+
* }
57+
* ]
58+
* },
59+
* {
60+
* variedad: "palomino",
61+
* calibres: [
62+
* ... como arriba ...
63+
* ]
64+
* }
65+
* ]
66+
*
67+
* @return {Object[]} - Los precios y cantidades de cada uva.
3668
*/
3769
function obtenerEntrada() {
3870
const precioRef = .75,
39-
rangoCorrUva = [.5, 2], // Factor corrector del precio según la variedad.
40-
rangoCorrCalibre = [1.2, 1.8], // Multiplicador del precio del calibre.
41-
noHayUva = .3, // Probabilidad de que no haya uva de un calibre determinado.
42-
rangoCantidad = [0, 30]; // Entre 0 y 30 Kg de cada calibre de uva.
71+
rangoCorrUva = [.5, 2], // Factor corrector del precio según la variedad.
72+
rangoCorrCalibre = [1.2, 1.8], // Multiplicador del precio del calibre.
73+
noHayUva = .3, // Probabilidad de que no haya uva de un calibre determinado.
74+
rangoCantidad = [50, 500], // Entre 50 y 500 Kg de cada calibre de uva.
75+
precisionCantidad = 3;
4376

4477
return VARIEDADES.map(variedad => {
4578
const uva = {nombre: variedad, calibres: []};
46-
let precio = (precioRef*generarAleatorio(...rangoCorrUva)).toFixed(2);
79+
let precio = (precioRef*generarAleatorio(...rangoCorrUva)).toFixed(precision);
4780

4881
for(const calibre of CALIBRES) {
4982
if(Math.random() < noHayUva) continue;
5083

5184
uva.calibres.push({
5285
nombre: calibre,
5386
precio,
54-
cantidad: generarAleatorio(...rangoCantidad).toFixed(3)
87+
cantidad: generarAleatorio(...rangoCantidad).toFixed(precisionCantidad)
5588
})
5689

5790
precio = (precio*generarAleatorio(...rangoCorrCalibre)).toFixed(2);
@@ -61,6 +94,20 @@ function obtenerEntrada() {
6194
});
6295
}
6396

64-
// Falta terminarlo.
6597

66-
console.log(obtenerEntrada().map(e => e.calibres));
98+
/**
99+
* Calcula el precio que hay que pagar a una determinada cosecha de uvas.
100+
*
101+
* @param {Object[]} cosecha - Cantidas y precios de cada variedad y calibre.
102+
*
103+
* @returns {number} - El dinero que debe pagarse a la cosecha.
104+
*/
105+
function calcularPago(cosecha) {
106+
return cosecha.reduce((ac, variedad) => ac + variedad.calibres.reduce((acc, e) => acc + e.precio*e.cantidad, 0), 0)
107+
.toFixed(precision);
108+
}
109+
110+
const uvaCosechada = obtenerEntrada();
111+
112+
console.log(uvaCosechada.map(e => e.calibres));
113+
console.log(calcularPago(uvaCosechada));
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/**
2+
* @file Obtener a partir de un número el resultante de invertir
3+
* todas sus cifras.
4+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
5+
*/
6+
7+
/**
8+
* Controla si se genera una entrada alteatoria o no.
9+
* @type {boolean}
10+
*/
11+
const aleatorio = true;
12+
13+
/**
14+
* Mayoría de edad
15+
* @type {number}
16+
*/
17+
const MAYORIA = 18;
18+
19+
/**
20+
* Fecha más antigua para generar fechas aleatorias.
21+
* @type {number}
22+
*/
23+
const MIN = new Date(1925, 1, 1),
24+
/**
25+
* Fecha más reciente para generar fechas aleatorias.
26+
* @type {number}
27+
*/
28+
MAX = new Date(); // hoy.
29+
30+
/**
31+
* Fechas predeterminadas.
32+
* @type {number}
33+
*/
34+
const FECHAS = [
35+
new Date(1967, 12, 1),
36+
new Date(2000, 3, 8),
37+
new Date(2010, 10, 11)
38+
];
39+
40+
41+
/**
42+
* Genera un entero aleatorio entre un límite inferior
43+
* y un límite superior
44+
*
45+
* @param {number} min - El límite inferior.
46+
* @param {number} max - El límite superior.
47+
*
48+
* @example
49+
* generarAleatorio(0, 10); // Entero entre 0 y 10 (ambos inclusive)
50+
*
51+
* @returns {number} - El entero aleatorio.
52+
*/
53+
function generarAleatorio(min, max) {
54+
return Math.round(Math.random()*(max - min)) + min;
55+
}
56+
57+
/**
58+
* Función generadora de fechas al azar entre dos fechas.
59+
*
60+
* @param {Date} min - Fecha más antigua. Tiempo 0 de la época UNIX, si no se especifica.
61+
* @param {Date} max - Fecha más reciente. Hoy, si no se especifica.
62+
*
63+
* @yields {Date} - La fecha al azar entre los dos límites suministrados.
64+
*/
65+
function* generarFecha(min = new Date(0), max = new Date()) {
66+
while(true) {
67+
yield new Date(generarAleatorio(min.getTime(), max.getTime()));
68+
}
69+
}
70+
71+
72+
/**
73+
* Calcula cuál es la edad en años.
74+
*
75+
* @param {Date} nacimiento - Fecha de nacimiento.
76+
* @param {Date} ref - Fecha de referencia para calcular la edad. Si no se especifica, hoy.
77+
*
78+
* @returns {number} - La edad en años; -1 si la fecha de referencia es posterior al nacimiento.
79+
*/
80+
function calcularEdad(nacimiento, ref = new Date()) {
81+
if(ref < nacimiento) return -1;
82+
83+
let edad = ref.getFullYear() - nacimiento.getFullYear();
84+
85+
// Pero si aún no ha sido su cumpleaños, tiene uno menos.
86+
edad -= (nacimiento.getMonth() > ref.getMonth() || nacimiento.getMonth() === ref.getMonth() && nacimiento.getDate() > ref.getDate());
87+
88+
return edad;
89+
}
90+
91+
/**
92+
* Determina si una persona es mayor de edad.
93+
*
94+
* @param {number|Date} nacimiento - Fecha de nacimiento o edad en años de la persona.
95+
*
96+
* @returns {boolean} - Si es o no mayor de edad.
97+
*/
98+
function esMayorDeEdad(nacimiento) {
99+
const edad = (nacimiento instanceof Date)?calcularEdad(nacimiento):nacimiento;
100+
101+
return edad >= MAYORIA;
102+
}
103+
104+
105+
// Programa principal.
106+
107+
const generador = generarFecha(MIN, MAX),
108+
fechas = aleatorio?FECHAS.map(e => generador.next().value):FECHAS;
109+
110+
for(const nacimiento of fechas) {
111+
let edad = calcularEdad(nacimiento),
112+
yymmdd = nacimiento.toJSON().slice(0, 10);
113+
114+
console.log(`La persona nacida en ${yymmdd} tiene ${edad} años y es ${esMayorDeEdad(edad)?"mayor":"menor"} de edad.`);
115+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"use strict";
2+
3+
/**
4+
* @file Excluir los números menores al último.
5+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
6+
*/
7+
8+
/**
9+
* Controla si se genera una entrada alteatoria o no.
10+
* @type {boolean}
11+
*/
12+
const aleatorio = true;
13+
14+
/**
15+
* Límite inferior predefinido para generar aleatorios.
16+
* @type {number}
17+
*/
18+
const MIN = 0,
19+
/**
20+
* Límite superior predefinido para generar aleatorios.
21+
* @type {number}
22+
*/
23+
MAX = 100;
24+
25+
/**
26+
* Lista predeterminada
27+
* @type {Number[]}
28+
*/
29+
const LISTA = [87, 22, 45, 78, 33, 64, 1, 66, 21, 56];
30+
31+
/**
32+
* Genera un entero aleatorio entre un límite inferior
33+
* y un límite superior
34+
*
35+
* @param {number} min - El límite inferior.
36+
* @param {number} max - El límite superior.
37+
*
38+
* @example
39+
* // Devuelve un entero entre 0 y 10 (ambos inclusive)
40+
* generarAleatorio(0, 10);
41+
*
42+
* @returns {number} - El entero aleatorio.
43+
*/
44+
function generarAleatorio(min, max) {
45+
return Math.round(Math.random() * (max - min)) + min;
46+
}
47+
48+
// Programa principal
49+
50+
const lista = aleatorio?LISTA.map(e => generarAleatorio(MIN, MAX)):LISTA;
51+
52+
// Como eliminar los números menores al último
53+
// no es algo a priori que sea útil en distintas situaciones,
54+
// no me molestaré ni en hacer una función.
55+
56+
console.log(`Lista: [${lista}].`);
57+
console.log(`Menores: [${lista.filter((e, _, arr) => e <= arr.at(-1))}]`);

0 commit comments

Comments
 (0)