Skip to content

Commit d086185

Browse files
authored
Merge pull request #44 from marcode24/2024-26
✨ Add challenge-26 solution
2 parents 650c982 + 4720fb1 commit d086185

File tree

4 files changed

+216
-0
lines changed

4 files changed

+216
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Reto 26: Calcula-el-porcentaje-completado
2+
3+
¡Santa Claus ya ha repartido todos los regalos! Ahora está revisando los informes de productividad de los elfos. Pero hay un problema: **la Product Owner, Mrs. Claus** 🧑‍🎄✨, necesita entender rápidamente si los elfos cumplieron con los tiempos estimados. Están haciendo **Agile Scream.**
4+
5+
Para ayudar a Mrs. Claus, tu tarea es calcular el porcentaje completado de cada tarea y devolverlo redondeado al número entero más cercano. Esto le permitirá planificar mejor para la próxima Navidad y mantener a todos contentos.
6+
7+
Esta es la función que espera:
8+
9+
```js
10+
getCompleted('01:00:00', '03:00:00') // 33%
11+
getCompleted('02:00:00', '04:00:00') // 50%
12+
getCompleted('01:00:00', '01:00:00') // 100%
13+
getCompleted('00:10:00', '01:00:00') // 17%
14+
getCompleted('01:10:10', '03:30:30') // 33%
15+
getCompleted('03:30:30', '05:50:50') // 60%
16+
```
17+
18+
🎁 **Ahora Santa Claus y los elfos merecen un descanso. ¡Esperamos que hayan disfrutado el AdventJS y lo recomienden a sus amigos!**
19+
20+
## Mi solución explicada
21+
22+
```js
23+
function getCompleted(timeWorked, totalTime) {
24+
const timeToSeconds = (time) => {
25+
const [hours, minutes, seconds] = time.split(':').map(Number);
26+
return hours * 3600 + minutes * 60 + seconds;
27+
};
28+
29+
const partSeconds = timeToSeconds(timeWorked);
30+
const totalSeconds = timeToSeconds(totalTime);
31+
32+
return `${Math.round((partSeconds / totalSeconds) * 100)}%`;
33+
}
34+
```
35+
36+
Al parecer, hay un reto extra en esta serie de retos de AdventJS **Interesante** 💪
37+
38+
Para resolver este reto, primero necesitamos convertir las horas, minutos y segundos a `segundos`. Para eso, creamos una función llamada `timeToSeconds` que recibe un tiempo en formato de cadena y lo convierte a segundos. Lo encapsulamos en una función porque como tenemos que hacerlo dos veces, es mejor tenerlo en un solo lugar.
39+
40+
Dentro de la función `timeToSeconds`, primero dividimos el tiempo en horas, minutos y segundos, partiéndolo por los dos puntos (`:`). Luego, convertimos cada parte a un número entero.
41+
42+
Finalmente, multiplicamos las horas por `3600`, los minutos por `60` y sumamos los segundos. Esto nos da el tiempo total en segundos.
43+
44+
¿Por qué 3600 y 60? Porque hay `3600` segundos en una hora y `60` segundos en un minuto. Así que, multiplicamos las horas por `3600` y los minutos por `60` para convertir todo a segundos. Luego, sumamos los segundos.
45+
46+
Después de tener el tiempo trabajado y el tiempo total en segundos, calculamos el porcentaje completado. Dividimos el tiempo trabajado entre el tiempo total y multiplicamos por `100` para obtener el porcentaje. Luego, utilizamos `Math.round` para redondear el resultado al número entero más cercano.
47+
48+
Vale la pena mencionar que `Math.round` redondea al número entero más cercano. Por ejemplo, `Math.round(0.5)` devuelve `1`, `Math.round(1.5)` devuelve `2` y `Math.round(2.4)` devuelve `2`.
49+
50+
Finalmente, devolvemos el porcentaje completado en formato de cadena, concatenando el porcentaje al final `'%'`.
51+
52+
**Veamos un ejemplo:**
53+
54+
Supongamos que tenemos la siguiente entrada:
55+
56+
```js
57+
getCompleted('03:30:30', '05:50:50');
58+
```
59+
60+
Nuestra ejecución sería la siguiente:
61+
62+
```js
63+
const partSeconds = timeToSeconds('03:30:30');
64+
const totalSeconds = timeToSeconds('05:50:50');
65+
```
66+
67+
Enfocándonos en `partSeconds`, primero dividimos el tiempo en horas, minutos y segundos:
68+
69+
```js
70+
const [hours, minutes, seconds] = time.split(':').map(Number);
71+
// const [hours, minutes, seconds] = '03:30:30'.split(':').map(Number);
72+
// const [hours, minutes, seconds] = ['03', '30', '30'].map(Number);
73+
const [hours, minutes, seconds] = [3, 30, 30];
74+
75+
// nuestras horas, minutos y segundos son:
76+
const hours = 3;
77+
const minutes = 30;
78+
const seconds = 30;
79+
```
80+
81+
Ahora, devolvemos el tiempo total en segundos:
82+
83+
```js
84+
return hours * 3600 + minutes * 60 + seconds;
85+
// return 3 * 3600 + 30 * 60 + 30;
86+
// return 10800 + 1800 + 30;
87+
return 12630;
88+
```
89+
90+
Hacemos lo mismo para `totalSeconds`, primero dividimos el tiempo en horas, minutos y segundos:
91+
92+
```js
93+
const [hours, minutes, seconds] = time.split(':').map(Number);
94+
// const [hours, minutes, seconds] = '05:50:50'.split(':').map(Number);
95+
// const [hours, minutes, seconds] = ['05', '50', '50'].map(Number);
96+
const [hours, minutes, seconds] = [5, 50, 50];
97+
98+
// nuestras horas, minutos y segundos son:
99+
const hours = 5;
100+
const minutes = 50;
101+
const seconds = 50;
102+
```
103+
104+
Ahora, devolvemos el tiempo total en segundos:
105+
106+
```js
107+
return hours * 3600 + minutes * 60 + seconds;
108+
// return 5 * 3600 + 50 * 60 + 50;
109+
// return 18000 + 3000 + 50;
110+
return 21050;
111+
```
112+
113+
Nuestras variables `partSeconds` y `totalSeconds` hasta este momento son:
114+
115+
```js
116+
// const partSeconds = timeToSeconds('03:30:30');
117+
const partSeconds = 12630;
118+
// const totalSeconds = timeToSeconds('05:50:50');
119+
const totalSeconds = 21050;
120+
```
121+
122+
Ahora, calculamos el porcentaje completado:
123+
124+
```js
125+
return `${Math.round((partSeconds / totalSeconds) * 100)}%`;
126+
// return `${Math.round((12630 / 21050) * 100)}%`;
127+
// return `${Math.round(0.6 * 100)}%`;
128+
// return `${Math.round(60)}%`;
129+
return '60%';
130+
```
131+
132+
Por lo tanto, el porcentaje completado es `60%`.
133+
134+
Y eso es todo. Hemos calculado el porcentaje completado de la tarea. 🎉
135+
136+
Ahora si, **¡Santa Claus y los elfos pueden disfrutar de su merecido descanso!** 🎅🎄✨
137+
138+
Nos vemos el próximo año en el **AdventJS 2025**. ¡Felices fiestas! 🎉🎁🎊
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function getCompleted(timeWorked, totalTime) {
2+
const timeToSeconds = (time) => {
3+
const [hours, minutes, seconds] = time.split(':').map(Number);
4+
return hours * 3600 + minutes * 60 + seconds;
5+
};
6+
7+
const partSeconds = timeToSeconds(timeWorked);
8+
const totalSeconds = timeToSeconds(totalTime);
9+
10+
return `${Math.round((partSeconds / totalSeconds) * 100)}%`;
11+
}
12+
13+
module.exports = getCompleted;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const getCompleted = require('./index');
2+
3+
describe('26 => Calcula-el-porcentaje-completado', () => {
4+
const TEST_CASES = [
5+
{
6+
input: ['01:00:00', '03:00:00'],
7+
output: '33%',
8+
},
9+
{
10+
input: ['02:00:00', '04:00:00'],
11+
output: '50%',
12+
},
13+
{
14+
input: ['02:00:00', '04:00:00'],
15+
output: '50%',
16+
},
17+
{
18+
input: ['01:00:00', '01:00:00'],
19+
output: '100%',
20+
},
21+
{
22+
input: ['00:10:00', '01:00:00'],
23+
output: '17%',
24+
},
25+
{
26+
input: ['01:10:10', '03:30:30'],
27+
output: '33%',
28+
},
29+
{
30+
input: ['03:30:30', '05:50:50'],
31+
output: '60%',
32+
},
33+
{
34+
input: ['00:00:00', '01:00:00'],
35+
output: '0%',
36+
},
37+
{
38+
input: ['00:00:01', '00:00:02'],
39+
output: '50%',
40+
},
41+
{
42+
input: ['23:59:59', '24:00:00'],
43+
output: '100%',
44+
},
45+
];
46+
47+
it('should return a string', () => {
48+
const result = getCompleted(...TEST_CASES[0].input);
49+
expect(typeof result).toBe('string');
50+
});
51+
52+
it.each(TEST_CASES)('should return $output', ({ input, output }) => {
53+
const result = getCompleted(...input);
54+
expect(result).toBe(output);
55+
});
56+
});

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,19 @@ npm run test 'year'/'challenge'/index.test.js
8484
| 23 | [🔢 Encuentra los números perdidos](https://adventjs.dev/es/challenges/2024/23) | 🟢 | [here](./2024/23-encuentra-los-numeros-perdidos/index.js) | [here](./2024/23-encuentra-los-numeros-perdidos/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8585
| 24 | [🪞 Verifica si los árboles son espejos mágicos](https://adventjs.dev/es/challenges/2024/24) | 🟡 | [here](./2024/24-verifica-si-los-arboles-son-espejos-magicos/index.js) | [here](./2024/24-verifica-si-los-arboles-son-espejos-magicos/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8686
| 25 | [🧙‍♂️ Ejecuta el lenguaje mágico](https://adventjs.dev/es/challenges/2024/25) | 🟡 | [here](./2024/25-ejecuta-el-lenguaje-magico/index.js) | [here](./2024/25-ejecuta-el-lenguaje-magico/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
87+
| 26 | [📊 Calcula el porcentaje completado](https://adventjs.dev/es/challenges/2024/26) | 🟢 | [here](./2024/26-calcula-el-porcentaje-completado/index.js) | [here](./2024/26-calcula-el-porcentaje-completado/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8788

8889
Difficulties legend:
8990
🟢 Easy 🟡 Medium 🔴 Hard
9091

92+
**My results:**
93+
94+
<img
95+
alt="adventjs-2024-results"
96+
src="https://res.cloudinary.com/dfeujtobk/image/upload/v1735374368/advent-js/results/25eba94f-c29f-495c-9140-3f86598d6b3c.png"
97+
width="800"
98+
style="border-radius: 1rem" />
99+
91100
</details>
92101

93102
## 🎯 2023 Challenges

0 commit comments

Comments
 (0)