
En este ejemplo se muestra el uso de los operadores aritméticos módulo y división exacta en Python, además se hace uso de funciones y llamadas entre ellas, y se trabaja con fragmentos (slice) de los elementos de un arreglo.
Enunciado del problema
Se nos entrega un arreglo de numeros enteros que representar el tiempo en milisegundos, se nos pide calcular la suma de todos estos valores y representarlos en otro arreglo de enteros de los cuales el primer elemento contendrá el número de días, el segundo elemento contendrá en número de horas, el tercer elemento contendrá el número de minutos, el cuarto elemento contendrá el número de segundos y el quinto elemento contendrá el número de milisegundos.
Si un tiempo es negativo, se lo contará como 0 milisegundos, si un tiempo es nulo o vacío también contará como 0 milisegundos.
Ejemplo:
Entrada: [65647440, 199644521]
Salida: [3, 1, 41, 31, 961]
Resolución:
Para resolver este ejercicio primero definiremos una variable que contenga los factores que permiten transformar milisegundos a segundos, minutos horas y días en ese oren, entonces tendremos:
factors = [1000, 60, 60, 24]
Ahora definiremos una funcion que nos permita calcular la suma de todos los tiempos que se nos proporcionan en el arreglo de entrada, esta función realizará las siguientes acciones:
- Inicialiar la variable total en 0 que es en donde se van a sumar los tiempos
- Validar si el arreglo de tiempos times que se recibe es diferente de vacío o nulo, en caso de serlo retornamos 0
- Recorremos el arreglo de tiempos en un bucle
- Validamos si el cada valor de tiempo recibido es diferente de nulo o diferente de 0
- Le sumamos a total el valor de tiempo recibido siempre que este sea positivo, caso contrario no sumamos nada
- Una vez que se procesaron todos los elementos del arreglo retornamos la suma de los tiempos
La función quedaría de la siguiente manera:
def sumTimes(times):
total = 0 # 1
if not times: # 2
return 0
for time in times: # 3
if time: # 4
total = total + time if time > 0 else total # 4
return total # 5
Ahora definiremos una función que nos permita calcular el valor de cada factor de conversión, por ejemplo, si queremos calcular los días que tiene un tiempo dado en milisegundos debemos realizar la operación milisegundos / (1000 * 60 * 60 * 24), esta función recibirá un arregño con los valores para calcular el factor de conversión y quedaría de la siguiente manera:
def calculateFactor(factors):
total = 1
for factor in factors:
total = total * factor
return total
La última funcion que vamos a definir será la que calcula el valor de los días, horas, minutos, segundos y milisegundos existentes en la suma de todos los tiempos que se nos han proporcionado, esta función realiza las siguientes tareas:
- Definimos la variable values en la que almacenaremos los valores calculados a partir del tiempo en milisegundos
- Guardamos en una variable el resultado de la suma de todos los tiempos que se nos han proprocionado
- Validamos que el tiempo total en milisegundos sea diferente de 0
- Si el tiempo total es diferente de 0, greamos un bucle descendente que inicie en el tamaño de los factores factors que en nuestro caso es de 4 y vaya disminuyendo hasta 0 con un paso de 1, es decir vamos a tener el bucle que toma los valores 4,3,2,1
- Calculamos el factor de conversión para cada unidad tomando solamente los elementos necesarios del arreglo de factores, por ejemplo para calcular el factor de los días usamos todo el arreglo [1000, 60, 60, 24], para calcular el factor de horas usamos el arreglo hasta la posición del factor para días [1000, 60, 60] y así hasta que el arreglo ya no tenga elementos
- Agregamos al arreglo de valores la división exacta del tiempo total en milisegundos para el factor de conversión
- Utilizamos el módulo para calcular el resto de la división, que corresponderá al tiempo restante luego de haber quitado la unidad superior, es decir si calculamos los días, el resto será las horas que quedaron luego de calcular el total de días que existían en el tiempo en milisegundos
- Una vez que hayamos procesado todos los factores del arreglo factors agregamos a values el ultimo resto que corresponderá a los milisegundos luego de calcular todas las demás unidades
- AL final retornamos el arreglo values que contendrá los elementos solicitados
La función quedaría de la siguiente manera:
def calculateValues(times):
values = [] # 1
total = sumTimes(times) # 2
if total: # 3
for i in range(len(factors),0,-1): # 4
factor = calculateFactor(factors[0:i]) # 5
values.append(total // factor) # 6
total = total % factor # 7
values.append(total) # 8
return values # 9
Ahora para probar nuestro código definiremos una variable que contenga el arreglo del ejemplo, luego ejecutaremos la función que calcula los valores y arignaremos el resultado en otra variable la cual imprimiremos por consola para visualizar el resultado.
times = [65647440, 199644521]
values = calculateValues(times)
print(values)
El resultado de la ejecución se puede visualizar en la imagen siguiente la cual coincide con la salida del ejemplo propuesto.
No hay comentarios.:
Publicar un comentario