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