Skip to content

Commit be5fe6f

Browse files
committed
2022 day 11
1 parent a6631ff commit be5fe6f

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ If you think you got into a better solution than the one I propose, please let m
2222
| 6 | [Doing gifts inventory](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day07.js) ||
2323
| 8 | [¡Necesitamos un mecánico!](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day08.js) ||
2424
| 9 | [Las locas luces de Navidad](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day09.js) ||
25-
| 10 | [Las locas luces de Navidad](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day10.js) ||
26-
| 11 | - | - |
25+
| 10 | [El salto del trineo de Papá Noel](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day10.js) ||
26+
| 11 | [Papá Noel es Scrum Master](https://github.com/arialdev/adventjs/blob/main/src/2022/exercices/day11.js) | |
2727
| 12 | - | - |
2828
| 13 | - | - |
2929
| 14 | - | - |

src/2022/exercices/day11.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* Problem description:
3+
Papa Noél está un poco preocupado porque los preparativos están llevando mucho tiempo. Hace poco se ha sacado una
4+
certificación de Scrum y ha decidido usar la metodología para organizar el trabajo de sus elfos.
5+
6+
Le dicen la duración esperada de las tareas con un string con el formato hh:mm:ss y en el mismo formato cuánto tiempo
7+
llevan trabajando en ella.
8+
9+
Pero Papa Noél no se entera rápidamente si falta o mucho para que termine, así que nos ha pedido que hagamos un programa
10+
que nos indique la porción de la tarea que ya se ha completado.
11+
12+
Por ejemplo, si la tarea dura 03:00:00 y llevan trabajando 01:00:00 entonces ya han completado 1/3 de la tarea. En código:
13+
14+
getCompleted('01:00:00', '03:00:00') // '1/3'
15+
getCompleted('02:00:00', '04:00:00') // '1/2'
16+
getCompleted('01:00:00', '01:00:00') // '1/1'
17+
getCompleted('00:10:00', '01:00:00') // '1/6'
18+
getCompleted('01:10:10', '03:30:30') // '1/3'
19+
getCompleted('03:30:30', '05:50:50') // '3/5
20+
21+
Ten en cuenta:
22+
-El formato de la hora es hh:mm:ss.
23+
-El formato de la salida es un string a/b donde a es la porción de la tarea que ya se ha completado y b es la porción de la
24+
tarea que falta por completar.
25+
-La porción siempre se muestra con la menor fracción posible. (por ejemplo, nunca se mostraría 2/4 porque se puede representar
26+
como 1/2).
27+
-Si ya se ha completado la tarea, la fracción sería 1/1.
28+
-Ningun elfo ha sido maltradado durante la ejecución de este reto ni han tenido que usar Scrum de verdad.
29+
*/
30+
31+
/**
32+
* Explicación:
33+
* - La entrada nos viene en formato string, pero para poder trabajar con la diferencia de tiempo nos conviene pasarlo a formato
34+
* numérico. Escogemos los segundos como unidad de tiempo para ser precisos.
35+
* - Para hacer la conversión de tiempo utilizamos una función que parsea el string, primero extrayendo las tres unidades
36+
* disponibles: horas, minutos y segundos, en ese orden. Después parseamos a número esos valores. Debido al Type Coercion este
37+
* último paso no es necesario, pues un '3' se trataría como un 3, pero haciendo este paso explícitamente nos curamos en salud.
38+
* Por último trabajamos cada unidad multiplicandolo por lo que toque y sumando los resultados para obtener los segundos totales.
39+
* - Ahora tenemos unos maravillosos numerador y denominador, tiempo transcurrido y tiempo estimado respectivamente, en segundos.
40+
* Necesitamos simplificar esa fracción, y para ello utilizamos el Máximo Común Divisor.
41+
*/
42+
43+
export default function getCompleted(part, total) {
44+
const getGCD = (a, b) => b ? getGCD(b, a % b) : a;
45+
const getSecondsFromString = (str => str
46+
.split(':')
47+
.map((t) => parseInt(t))
48+
.reduce((acc, t, i) => acc + t * Math.pow(60, 2 - i), 0));
49+
50+
const elapsedSeconds = getSecondsFromString(part);
51+
const estimatedSeconds = getSecondsFromString(total);
52+
53+
const gcd = getGCD(elapsedSeconds, estimatedSeconds);
54+
const numerator = elapsedSeconds / gcd;
55+
const denominator = estimatedSeconds / gcd;
56+
57+
return numerator + '/' + denominator;
58+
}

0 commit comments

Comments
 (0)