Skip to content

Commit 902bed4

Browse files
José Miguel Sánchez AlésJosé Miguel Sánchez Alés
authored andcommitted
Añade algunas resoluciones de ejercicios sobre Javascript
1 parent 467ea62 commit 902bed4

File tree

8 files changed

+399
-33
lines changed

8 files changed

+399
-33
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* @file Realiza tiradas de dos dados hasta que en una misma tirada
3+
* los dos dados sacan la misma puntuación.
4+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
5+
*/
6+
7+
/**
8+
* Número de datos lanzados en una tirada.
9+
* @type {number}
10+
*/
11+
const numDados = 2,
12+
/**
13+
* Número de caras de cada dado.
14+
* @type {number}
15+
*/
16+
numCaras = 6;
17+
18+
/**
19+
* Genera un entero aleatorio entre un límite inferior
20+
* y un límite superior
21+
*
22+
* @param {number} min - El límite inferior.
23+
* @param {number} max - El límite superior.
24+
*
25+
* @example
26+
* generarAleatorio(0, 10); // Entero entre 0 y 10 (ambos inclusive)
27+
*
28+
* @returns {number} - El entero aleatorio.
29+
*/
30+
function generarAleatorio(min, max) {
31+
return Math.round(Math.random()*(max - min)) + min;
32+
}
33+
34+
35+
/**
36+
* Lanza n dados hasta que todas las puntuaciones de un misma tirada sean iguales.
37+
*
38+
* @param {number} n - Número de dados en la tirada
39+
*
40+
* @yields {Array} - La puntuación de cada dado.
41+
*/
42+
function* generarTirada(n) {
43+
let tirada;
44+
45+
if(!Number.isInteger(n) || n < 1) {
46+
throw "Debe tirarse al menos un dado";
47+
}
48+
49+
// Las tiradas continúan mientras todas
50+
// las puntuaciones de una misma tirada no sean iguales.
51+
do {
52+
// Una tirada son "n" puntuaciones de dados
53+
tirada = Array(n).fill(null).map(e => generarAleatorio(1, numCaras));
54+
yield tirada;
55+
} while(tirada.some((e, _, arr) => e !== arr[0]));
56+
}
57+
58+
// Programa principal
59+
60+
const partida = generarTirada(numDados);
61+
let dados, intentos = 0;
62+
63+
for(dados of partida) {
64+
intentos++;
65+
console.log(`Resultado de la ${intentos}ª tirada: ${dados}.`);
66+
}
67+
68+
console.log(`Se han tardado ${intentos} tandas en sacar todo ${dados[0]} simultáneamente.`);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"use strict";
2+
3+
/**
4+
* @file Crear indexOf_N() que busque la aparición n-ésima de un determinado valor.
5+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
6+
*/
7+
8+
9+
/**
10+
* Busca en un array la aparición n-ésima de un determinado valor.
11+
*
12+
* No es lo más eficiente, pero se ha usado una función recursiva
13+
* a partir del método index_Of.
14+
*
15+
* @param {Array} arr - Array en que se busca.
16+
* @param {any} valor - Valor buscado.
17+
* @param {number} n - Número de aparición.
18+
*
19+
* @returns {number} - La posición que ocupa la n-ésima aparición de valor.
20+
* NaN si no hay resultados.
21+
*/
22+
function indexOf_N(arr, valor, n) {
23+
const pos = arr.indexOf(valor);
24+
25+
if(pos === -1) return NaN
26+
else return pos + ((n>1)?(1 + indexOf_N(arr.slice(pos + 1), valor, n-1)):0);
27+
}
28+
29+
30+
const a = [0, 1, 4, 1, 2, 1, 1, 4, 5, 6];
31+
console.log(indexOf_N(a, "a", 4));
32+
console.log(indexOf_N(a, 2, 4));
33+
console.log(indexOf_N(a, 1, 4));
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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 = 99999;
23+
24+
/**
25+
* Números predeterminados
26+
* @type {number}
27+
*/
28+
const NUMEROS = [1452, 1221, 535, 78687, 321];
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+
* Comprueba si un número es capicúa
60+
*
61+
* @param {number} n - El número a comprobar.
62+
*
63+
* @returns {boolean} - Si lo es o no.
64+
*/
65+
function esCapicua(n) {
66+
return n === invertirNumero(n);
67+
}
68+
69+
const numeros = aleatorio?NUMEROS.map(e => generarAleatorio(MIN, MAX)):NUMEROS;
70+
for(const num of numeros) {
71+
console.log(`El número ${num}${esCapicua(num)?"":" no"} es capicúa.`);
72+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/**
2+
* @file Obtener los beneficios de una venta de uvas.
3+
* @author José Miguel Sánchez Alés <jsanale860@g.educaand.es>
4+
*/
5+
6+
/**
7+
* Calibres existentes.
8+
* @type {Array}
9+
*/
10+
const CALIBRES = ["1", "2", "3"],
11+
/**
12+
* Tipos de uva.
13+
* @type {Array}
14+
*/
15+
VARIEDADES = ["tempranillo", "palomino", "moscatel"];
16+
17+
/**
18+
* Genera un número aleatorio entre un límite inferior
19+
* y un límite superior
20+
*
21+
* @param {number} min - El límite inferior.
22+
* @param {number} max - El límite superior.
23+
*
24+
* @returns {number} - El número aleatorio.
25+
*/
26+
function generarAleatorio(min, max) {
27+
return Math.random()*(max - min) + min;
28+
}
29+
30+
/**
31+
* Genera los precios y las cantidades de uva de forma aleatoria.
32+
* En un programa serio posiblemente debería leerse la entrada desde
33+
* un documento JSON.
34+
*
35+
* @return {Object} - Los precios y cantidades de cada uva.
36+
*/
37+
function obtenerEntrada() {
38+
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.
43+
44+
return VARIEDADES.map(variedad => {
45+
const uva = {nombre: variedad, calibres: []};
46+
let precio = (precioRef*generarAleatorio(...rangoCorrUva)).toFixed(2);
47+
48+
for(const calibre of CALIBRES) {
49+
if(Math.random() < noHayUva) continue;
50+
51+
uva.calibres.push({
52+
nombre: calibre,
53+
precio,
54+
cantidad: generarAleatorio(...rangoCantidad).toFixed(3)
55+
})
56+
57+
precio = (precio*generarAleatorio(...rangoCorrCalibre)).toFixed(2);
58+
}
59+
60+
return uva;
61+
});
62+
}
63+
64+
// Falta terminarlo.
65+
66+
console.log(obtenerEntrada().map(e => e.calibres));

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,21 @@ function generarAleatorio(min, max) {
5555
* @returns {Array} - Un array con [h, m, s]
5656
*/
5757
function conversorTiempo(t) {
58-
const res = [t, 0, 0];
58+
const res = [t, 0, 0],
59+
factor = 60; // 1min tiene 60s; 1 hora, 60min
5960

61+
// La fracción inferior es el resto de la división;
62+
// y la fracción siguiente, la división entera.
6063
for(let i=0; i < res.length - 1; i++) {
61-
res[i+1] = Math.floor(res[i]/60);
62-
res[i] = res[i]%60;
64+
[res[i], res[i+1]] = [res[i]%factor, Math.floor(res[i]/factor)];
6365
}
6466

67+
// Preferimos [h, m, s] que [s, m, h]
6568
return res.reverse();
6669

6770
}
6871

6972
const tiempo = aleatorio?generarAleatorio(MIN, MAX):TIEMPO;
7073

7174
let hms = conversorTiempo(tiempo);
72-
7375
console.log(`${tiempo} segundos son ${hms[0]} horas, ${hms[1]} minutos y ${hms[2]} segundos.`);

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

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,24 @@
66
*/
77

88
/**
9-
* Controla si se genera una entrada alteatoria o no.
9+
* Controla si se genera una entrada aleatoria o no.
1010
* @type {boolean}
1111
*/
12-
const aleatorio = false;
12+
const aleatorio = true;
1313

1414
/**
1515
* Operaciones disponibles
16-
* @type {Array}
16+
* @type {object}
1717
*/
18-
const OPERACIONES = ['+', '-', '*', '/', '%']
18+
const OPERACIONES = {
19+
"suma": (a, b) => a + b,
20+
"resta": (a, b) => a - b,
21+
"producto": (a, b) => a * b,
22+
"división": (a, b) => a / b,
23+
// Esta no la recoge el enunciado, pero es una prueba de que es muy
24+
// extender la solución a otras operaciones no exigidas por el enunciado.
25+
"módulo": (a, b) => a % b
26+
}
1927

2028
/**
2129
* Límite inferior predefinido para generar aleatorios.
@@ -57,29 +65,14 @@ function generarAleatorio(min, max) {
5765
return Math.round(Math.random()*(max - min)) + min;
5866
}
5967

68+
// Operandos
6069
const a = aleatorio?generarAleatorio(MIN, MAX):A,
6170
b = aleatorio?generarAleatorio(MIN, MAX):B;
6271

63-
const operacion = OPERACIONES[generarAleatorio(0, OPERACIONES.length - 1)];
64-
65-
let resultado;
72+
// Escogemos una operación al azar entre las posibles.
73+
const opArray = Object.entries(OPERACIONES);
74+
let [nombre, operacion] = opArray[generarAleatorio(0, opArray.length - 1)];
6675

67-
switch(operacion) {
68-
case '+':
69-
resultado = a + b;
70-
break;
71-
case '-':
72-
resultado = a - b;
73-
break;
74-
case '*':
75-
resultado = a * b;
76-
break;
77-
case '/':
78-
resultado = a / b;
79-
break;
80-
case '%':
81-
resultado = a % b;
82-
break;
83-
}
76+
let resultado = operacion(a, b);
8477

85-
console.log(`El resultado de ${a} ${operacion} ${b} es ${resultado}`);
78+
console.log(`La operación ${nombre} de ${a} y ${b} es ${resultado}.`);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ const DESCRIPTIVAS = {
6060
}
6161

6262
const nota = aleatorio?generarAleatorio(MIN, MAX):NOTA,
63-
// Convertimos a [descr, lím. inf] y nos quedamos sólo con las tuplas
64-
// cuyo límite es más pequeño que la nota. Si las ordenamos, la tupla
63+
// Convertimos a [descr, lím. inf] y eliminamos las tuplas
64+
// cuyo límite es mayor que la nota. Si las ordenamos, la tupla
6565
// que contiene la nota descriptiva es la última, ya que es la que
6666
// contiene el mayor de los límites.
6767
notaDescriptiva = Object.entries(DESCRIPTIVAS)
68-
.filter(e => e[1] < nota)
68+
.filter(e => e[1] <= nota)
6969
.sort(e => e[1]).at(-1)[0];
7070

71-
console.log(`Un ${nota} equivale a ${notaDescriptiva}.`);
71+
console.log(`Un ${nota} equivale a ${notaDescriptiva}.`);

0 commit comments

Comments
 (0)