[Python-es] Ambulancias: segundo intento

Bartolomé Sintes Marco BartolomeSintes en ono.com
Mar Nov 26 21:51:19 CET 2002


Hola,
Esta es una solución (espero) del problema de las ambulancias utilizando
simplemente listas. Tal como está escrito, simultáneo significa "en la 
misma hora" (cosa discutible, puesto que el servicio 46 y el 79 no se 
solapan). Además si un servicio termina a las 11:00 se cuenta como 
servicio realizado en la hora 11.

En fin, al ejecutar este programa, me da como solución:
Máximo:  15
['20020621', '11', 15, [34, 38, 43, 46, 72, 75, 79, 131, 206, 208, 212, 214,
215, 218, 224]]
   3410:0812:4520020621
   3810:0811:3520020621
   4306:5013:4520020621
   4609:3011:0020020621
   7211:0011:1520020621
   7510:2011:0020020621
   7911:3011:4520020621
  13110:0011:0020020621
  20608:1511:5020020621
  20811:5013:1520020621
  21210:5812:0020020621
  21411:0011:4520020621
  21510:2012:0020020621
  21810:0012:1520020621
  22410:0011:0020020621

Es decir que el máximo de servicios en la misma hora son 15, que eso pasó el
21/06/2002 de 11:00 a 11:59 y los servicios realizados fueron el 34, el 38, el 
43, etc hasta el 224. ¿Es esa la solución?

Un saludo,
Barto
------------ EL PROGRAMA EMPIEZA AQUÍ -------------

# 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 = "simul.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)/24):
    datos = datos + [todo[i*24:i*24+24]]
for i in range(len(datos)):
    datos[i] = [datos[i][15:23], datos[i][5:10], datos[i][10:15],
int(datos[i][0:5])]

# Los servicios con hora de inicio y final 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', datos[i][3]],
                        [dia_siguiente(datos[i][0]), '00:00', datos[i][2],
datos[i][3]]]

# 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,
[datos[i][3]]]]

# 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
        trabajos[i-1][3] = trabajos[i-1][3] + trabajos[i][3]
        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
        for j in i[3]:
            print todo[(j-2)*24:(j-2)*24+23]

------------ EL PROGRAMA ACABA AQUÍ -------------
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20021126/acb69a6e/attachment.html>


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