Ambulancias. Una solución

Bartolomé Sintes Marco BartolomeSintes en ono.com
Lun Nov 25 14:35:06 CET 2002


Hola,

He escrito un programa que espero que resuelva el problema propuesto. No es muy sofisticado, pues mis conocimientos de Python son limitados. Espero que si véis mejoras obvias al programa, lo digáis. Y si el programa no va bien, espero abucheos :-)

Una sugerencia: Estaría bien que al proponer un problema se dieran ejemplos. En este caso, se podrían proporcionar ficheros con los registros que hay que analizar y cuál la respuesta correcta para ellos. Así sería más fácil probar el programa (ya que aquí no tenemos un cliente que lo pruebe por nosotros :-)

Bueno, este es el programa:

# AMBULANCIAS, por Barto 2002-11-25
# Problema propuesto en http://listas.aditel.org/archivos/python-es/2002-November/001553.html

from string import zfill

# Camino y nombre del archivo con los servicios
camino = "C:/Mis documentos/Barto/02-03 Abastos/Python/Prueba_semanal/"
nombre_archivo = "ambulancias_registro.txt"

# Esta función es para calular el día siguiente a un día cualquiera
# Tal y como aparece aquí, todos los años tienen 12 meses de 31 días
# Me daba pereza considerar todos los casos (sobre todo los bisiestos)
def dia_siguiente(fecha):
    sig = [int(str(fecha[0:4])), int(str(fecha[4:6])),int(str(fecha[6:8]))+1]
    if sig[2] == 32:
        sig[2] = 1
        sig[1] = sig[1] + 1
    if sig[1] == 13:
        sig[1] = 1
        sig[0] = sig[0] + 1
    return zfill(sig[0],4)+zfill(sig[1],2)+zfill(sig[2],2)

# Primero se lee el archivo
todo = file(camino+nombre_archivo,"r").read()

# Ahora se crea una lista en la que cada elemento es un servicio
# cada servicio es una lista con la fecha, la hora de inicio y la hora de finalización
datos = []
for i in range(len(todo)/23):
    datos = datos + [todo[i*23:i*23+23]]
for i in range(len(datos)):
    datos[i] = [datos[i][15:23], datos[i][5:10], datos[i][10:15]]

# Los servicios con hora de inicio y fainal 00:00 se eliminan
# Los servicios que empiezan un día y terminan el siguiente (se supone que ninguno dura más de 24 horas)
# se dividen en dos servicios, uno hasta las 23:59 de un día y el otro desde las 00:00 del día siguiente
for i in range(len(datos)-1,-1,-1):
    if datos[i][1] = datos[i][2] = '00:00':
        del datos[i]
    elif datos[i][2] < datos[i][1]:
        datos[i:i+1] = [[datos[i][0], datos[i][1], '23:59'],
                        [dia_siguiente(datos[i][0]), '00:00', datos[i][2]]]

# Se ordena la lista de servicios por fecha y hora
datos.sort()        

# Se crea una lista nueva en la que cada servicio se divide en servicios de una hora
# Se añade un contador de servicios realizados esa fecha y hora (al crearlo vale 1 para todos)
trabajos=[]
for i in range(len(datos)):
    for j in range(int(datos[i][1][0:2]), int(datos[i][2][0:2])+1):
            trabajos = trabajos + [[datos[i][0],zfill(j,2),1]]

# Se ordena la lista de servicios separados en horas
trabajos.sort()

# Se acumulan los servicios 
for i in range(len(trabajos)-1,0,-1):
    if trabajos[i][0] == trabajos[i-1][0] and trabajos[i][1] == trabajos[i-1][1]: # si dos servicios seguidos tienen la misma fecha y hora
        trabajos[i-1][2] = trabajos[i-1][2]+trabajos[i][2] # se acumulan los contadores en el primero
        del trabajos[i] # y se elimina el segundo servicio

# Se busca dónde está el máximo
max = 0
for i in trabajos:
    if i[2] > max:
        max = i[2]

# Se imprime el valor máximo y cuándo se ha producido
print "Máximo: ", max
for i in trabajos:
    if i[2] == max:
        print i

# FIN DEL PROGRAMA

Nota: El archivo con los servicios que he gastado tiene esta pinta (los 50 servicios son de noviembre de 2002):
0000021:4610:36200211310000123:1609:28200211180000200:3902:08200211240000315:4201:22200211290000417:2006:55200211180000512:4614:54200211110000617:5411:36200211050000707:4620:15200211080000811:2405:17200211050000917:2817:05200211220001011:0014:38200211190001108:2712:16200211030001203:3103:44200211170001301:4104:16200211100001403:0717:19200211290001520:1602:13200211280001618:0611:02200211230001717:3802:44200211280001809:4423:33200211260001911:5006:51200211060002013:3603:14200211060002114:2203:03200211180002209:5808:54200211030002320:4115:56200211100002403:0704:43200211140002505:1803:50200211130002621:4405:07200211100002705:2323:10200211240002817:1504:24200211010002912:3421:00200211140003008:3409:03200211190003108:5214:19200211010003206:3914:49200211120003310:1718:16200211050003403:3708:11200211080003517:5712:22200211150003608:1716:55200211290003710:4518:35200211270003804:4215:35200211080003923:3218:31200211180004006:0522:57200211090004111:4907:11200211230004201:1615:01200211150004313:1223:14200211020004404:1700:01200211250004522:4617:30200211060004609:2607:57200211110004717:1302:32200211280004808:0606:33200211210004917:2919:2820021125
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20021125/fcee748e/attachment.html>


Más información sobre la lista de distribución Python-es