Desafío práctico: optimizar el recorrido de un ascensor
Resumen
Optimizar el recorrido de un ascensor en un edificio de varios pisos requiere aplicar pensamiento lógico y estructurado. Vas a resolver un desafío práctico creando un diagrama de flujo y el código necesario, en cualquier lenguaje de programación, para lograr que un ascensor transporte eficientemente a varias personas desde diferentes pisos y hasta distintos destinos, reduciendo tanto el tiempo empleado como la cantidad total de paradas.
¿Cómo organizar el recorrido del ascensor para la menor cantidad de paradas?
El ascensor parte siempre desde el primer piso en un edificio de diez pisos. Cuatro personas aguardan en diferentes niveles, listos para dirigirse a distintos destinos:
Vos estás en el piso 2 y tu destino es el piso 10.
Pedro se encuentra en el piso 5 y quiere ir al piso 1.
Juan espera en el piso 8 y necesita llegar al piso 7.
Carla aguarda en el piso 3 y desea ir al piso 4.
Para minimizar paradas y tiempo de desplazamiento, considerá:
Agrupar personas que viajan en la misma dirección, ya sea de subida o de bajada.
Planificar un recorrido que permita al ascensor evitar detenciones innecesarias cuando se traslada vacío.
Organizar las paradas en función de la proximidad entre los niveles donde suben y bajan los pasajeros.
¿Qué pasos seguir para resolver este desafío en código?
Crear una programación lógica implica poner atención en los siguientes pasos fundamentales:
Definir variables: pisos iniciales y destinos de cada persona, posición inicial del ascensor (piso 1).
Establecer reglas: siempre minimizar paradas y tiempo; mover pasajeros en dirección común.
Estructurar secuencia lógica:
Identificar los pisos donde debe detenerse inicialmente.
Agrupar movimientos por direccionamiento ascendente o descendente.
Repetir hasta entregar en el destino final a cada pasajero.
Crear y probar el diagrama de flujo con las condiciones planteadas antes de pasar al código.
¿Qué recomendaciones considerar para elegir un lenguaje de programación?
A la hora de resolver este tipo de desafíos, seleccionar el lenguaje de programación más acorde a tus objetivos futuros es esencial. Puedes explorar:
Python: útil para ciencia de datos, machine learning y automatización.
JavaScript: orientado hacia proyectos web.
Optar por otro lenguaje si las preferencias o necesidades son distintas.
Comprender los fundamentos básicos del pensamiento lógico-algorítmico mejora cualquier aprendizaje y desarrollo futuro, haciendo que la elección concreta del lenguaje sea menos determinante.
¿Estás listo para crear tu diagrama y escribir tu código? Te invito a compartir tu solución en los comentarios.
Pienso qué el desafío no está en las paradas, porque todos están en paradas diferentes y van a pisos diferentes, lo único a tener en cuenta es no repetir el mismo piso
Diría que el desafío está en el tiempo, basado en eso daré 2 segundos a cada parada sea para subirse o bajarse del ascensor y 1 segundo a cambiar de piso.
tiempo\_parada = 2
tiempo\_cambio\_piso = 1
tiempo\_total = 0
def calcularTiempo(inicio, fin):
  return tiempo\_cambio\_piso\*abs(fin - inicio) + tiempo\_parada
\# Recogere Piso2
tiempo\_total += calcularTiempo(1, 2)
\# Recoger a Carla Piso3
tiempo\_total += calcularTiempo(2, 3)
\# Dejar a Carla Piso4
tiempo\_total += calcularTiempo(3, 4)
\# Recoger a Pedro Piso5
tiempo\_total += calcularTiempo(4, 5)
\# Recoger a Juana Piso 8
tiempo\_total += calcularTiempo(5, 8)
\# Dejarme Piso10
tiempo\_total += calcularTiempo(8, 10)
\# Dejar a Juana piso7
tiempo\_total += calcularTiempo(10, 7)
\# Dejar a Pedro piso1
tiempo\_total += calcularTiempo(7, 1)
print(f"El tiempo total es de {tiempo\_total} segundos")
El tiempo total es de 34 segundos
tiempo_parada =2tiempo_cambio_piso =1tiempo_total =0defcalcularTiempo(inicio, fin):return tiempo_cambio_piso*abs(fin - inicio)+ tiempo_parada
# Recogere Piso2tiempo_total += calcularTiempo(1,2)# Recoger a Carla Piso3tiempo_total += calcularTiempo(2,3)# Dejar a Carla Piso4tiempo_total += calcularTiempo(3,4)# Recoger a Pedro Piso5tiempo_total += calcularTiempo(4,5)# Recoger a Juana Piso 8tiempo_total += calcularTiempo(5,8)# Dejarme Piso10tiempo_total += calcularTiempo(8,10)# Dejar a Juana piso7tiempo_total += calcularTiempo(10,7)# Dejar a Pedro piso1tiempo_total += calcularTiempo(7,1)print(f"El tiempo total es de {tiempo_total} segundos")```tiempo\_parada = 2tiempo\_cambio\_piso = 1tiempo\_total =0defcalcularTiempo(inicio, fin):return tiempo\_cambio\_piso\*abs(fin - inicio)+ tiempo\_parada
\# Recogere Piso2tiempo\_total += calcularTiempo(1,2)# Recoger a Carla Piso3tiempo\_total += calcularTiempo(2, 3)# Dejar a Carla Piso4tiempo\_total += calcularTiempo(3, 4)# Recoger a Pedro Piso5tiempo\_total += calcularTiempo(4, 5)# Recoger a Juana Piso 8tiempo\_total += calcularTiempo(5, 8)# Dejarme Piso10tiempo\_total += calcularTiempo(8, 10)# Dejar a Juana piso7tiempo\_total += calcularTiempo(10, 7)# Dejar a Pedro piso1tiempo\_total += calcularTiempo(7, 1)print(f"El tiempo total es de {tiempo\_total} segundos")
Realmente este reto me hizo llorar no pude hacerlo solo, me toco pedir ayuda y tutoria de gemini para hacerlo paso a paso lo primero que me dijo fue que hay que optimizar el reccorido en 2 paras 1 para la subida otro para la bajada dentro es estos paras nesecitabamos una condicion Si entonces anidada y tambien me enseño a que podia dimensionar varias partes en una sola dimension para no estarlo haciendo una a una tambien me recomendo hacer un gimnasio de pensamiento logico para estar puliendo y practicando con el esto
Algoritmo Elevador_Final_Pro
// 1. Datos del edificio y gente
Dimensionar nombres(4), origen(4), destino(4)
nombres[0] <- 'Steven'
origen[0] <- 2
destino[0] <- 10
nombres[1] <- 'Pedro'
origen[1] <- 5
destino[1] <- 1
nombres[2] <- 'Juan'
origen[2] <- 8
destino[2] <- 7
nombres[3] <- 'Carla'
origen[3] <- 3
destino[3] <- 4
// 2. VIAJE DE SUBIDA (Del 1 al 10)
Escribir '--- ASCENSOR SUBIENDO ---'
Para p<-1 Hasta 10 Hacer
Para i<-0 Hasta 3 Hacer
// Si el origen es este piso y va hacia ARRIBA
Si origen[i]==p Y destino[i]>origen[i] Entonces
Escribir 'Piso ', p, ': Sube ', nombres[i]
FinSi
// Si el destino es este piso y venía desde ABAJO
Si destino[i]==p Y destino[i]>origen[i] Entonces
Escribir 'Piso ', p, ': Baja ', nombres[i]
FinSi
FinPara
FinPara
// 3. VIAJE DE BAJADA (Del 10 al 1)
Escribir '--- ASCENSOR BAJANDO ---'
Para p<-10 Hasta 1 Con Paso -1 Hacer
Para i<-0 Hasta 3 Hacer
// Si el origen es este piso y va hacia ABAJO
Si origen[i]==p Y destino[i]<origen[i] Entonces
Escribir 'Piso ', p, ': Sube ', nombres[i]
FinSi
// Si el destino es este piso y venía desde ARRIBA
Si destino[i]==p Y destino[i]<origen[i] Entonces
Escribir 'Piso ', p, ': Baja ', nombres[i]
FinSi
FinPara
FinPara
FinAlgoritmo
Implementación del Motor de Decisiones: Lógica de Paradas Concurrentes
1. Explicación: La Estrategia de Eficiencia
Para este proyecto, el objetivo no es solo mover un ascensor, sino optimizar el recurso energético y el tiempo. He aplicado el Algoritmo SCAN (o Algoritmo del Elevador).
• Agrupación Direccional: El sistema no atiende llamadas por orden de llegada, sino por dirección. Si el ascensor sube, termina todas las tareas de subida antes de cambiar de sentido.
• Recogida en Ruta: El ascensor es capaz de recoger pasajeros nuevos siempre que su destino coincida con la dirección actual de la cabina.
• Impacto: Esto reduce el recorrido total de la cabina de 30 pisos (en un sistema simple) a solo 18 pisos, logrando un ahorro del 40%.
2. Pensamiento Lógico: El Diagrama de Flujo
Antes de programar, diseñé la lógica de decisión. Este diagrama muestra cómo el sistema filtra las solicitudes y decide cuándo detenerse.
Puntos clave del diagrama:
1. Entrada de datos: Registro de todos los pasajeros.
2. Clasificación: División entre grupos "Subida" y "Bajada".
3. Bucle de Movimiento: Verificación constante de origen/destino en cada piso.
3. Implementación: El Código en Python
Aquí el pensamiento lógico se convierte en instrucciones reales. El código es interactivo y permite ingresar cualquier número de pasajeros.
print(f"MOVIMIENTOS TOTALES DE LA CABINA: {pasos_totales_globales} pisos")
print(f"Estado Final: ESPERA en piso {piso_actual}")
print(f"Autor: José Milton Ruiz Murillo")
print("="*50)
# Iniciar el programa
if __name__ == "__main__":
simular_ascensor_final()
4. Resultados y Validación: Un Sistema Interactivo y Transparente
Para validar que el pensamiento lógico se aplicó correctamente, el programa genera un flujo de salida dividido en tres hitos fundamentales:
A. Entrada Dinámica (El valor agregado)
A diferencia de un código estático, este proyecto incluye una interfaz de consola interactiva.
• Qué hace: El sistema inicia solicitando la cantidad de usuarios y, acto seguido, pide individualmente el nombre, origen y destino de cada pasajero.
• Por qué importa: Esto permite probar el algoritmo bajo cualquier escenario de estrés o cantidad de personas sin modificar el código.
B. Trazabilidad en Tiempo Real (Proceso de Movimiento)
Mientras el ascensor opera, el sistema no salta directamente al final; va narrando su recorrido.
• Visualización: Verás en pantalla cómo el contador de pisos avanza uno a uno (Piso 1..., Piso 2...).
• Eventos: El programa señaliza con etiquetas claras ([!] para subir y [OK] para bajar) el momento exacto en que interactúa con un pasajero, permitiendo verificar que se cumple la Regla de Coincidencia (recoger a alguien mientras ya hay otro pasajero a bordo).
C. Reporte de Eficiencia Final (Métricas de Éxito)
Al finalizar todas las tareas, el sistema entrega un desglose detallado:
• Conteo por Pasajero: Indica cuántos pisos se movió cada persona (comprobando que su viaje fue directo).
• Conteo Global: Muestra la cantidad total de pisos que se desplazó la cabina.
• Validación Lógica: Aquí se confirma el éxito del proyecto: el total de pisos recorridos es menor a la suma de los viajes individuales, demostrando una optimización real de recursos.
Conclusión
Lo que hace único a este controlador es su capacidad interactiva. He diseñado el código para que, al ejecutarse, solicite dinámicamente el número de usuarios y sus rutas (Origen/Destino).
Durante la ejecución, el sistema ofrece una bitácora en tiempo real de cada piso recorrido, diferenciando visualmente cuándo está en 'Modo Subida' o 'Modo Bajada'. Finalmente, el programa entrega un reporte de métricas que desglosa los movimientos individuales frente al movimiento global, validando matemáticamente la eficiencia del algoritmo.
Way to go Milton!! 💯
que curso tan bueno, 100000/10
Hola, al problema le agregue tiempo porque siempre se harán 8 paradas, así que le agregue 1 segundo por piso y 4 segundos por subida o bajada.
Este curso no cumple mis expectativas. Pésimo. Su examen va dirigido a programadores. Muy lejos de las habilidades que requiero fortalecer. Esto es una habilidad dura
Buen curso, sin embargo, creo que las preguntas deberían mejorarse para evaluar conceptos generales y lógica.
Comparto el diagrama que hice:
Primera versión del código (no respectaba si subia o bajaba, es decir, no estaba optimizado):
piso_actual =1direccion ="subir"recogida =[2,5,8,3]destinos =[4,10,7,1]whilelen(recogida)!=0 and len(destinos)!=0:print("Piso actual:", piso_actual)if piso_actual inrecogida:print("[PARAR Y RECOGER]") recogida.remove(piso_actual)print("Recogida", recogida)if piso_actual indestinos:print("[PARAR Y DEJAR]") destinos.remove(piso_actual)
#logica movimiento
if direccion =="subir": piso_actual+=1if piso_actual ==10: direccion ="bajar"else: piso_actual-=1if piso_actual ==1: direccion ="subir"print("TODOS HAN LLEGADO A SU DESTINO!")
Versión optimizada teniendo en cuenta los siguientes puntos:
Agrupar personas que viajan en la misma dirección, ya sea de subida o de bajada.
Planificar un recorrido que permita al ascensor evitar detenciones innecesarias cuando se traslada vacío.
Organizar las paradas en función de la proximidad entre los niveles donde suben y bajan los pasajeros.
Identificar los pisos donde debe detenerse inicialmente.
Agrupar movimientos por direccionamiento ascendente o descendente.
Repetir hasta entregar en el destino final a cada pasajero.
# Estado inicial
piso_actual =1direccion ="subir"# Diccionario de solicitudes {piso_origen: piso_destino}solicitudes ={2:10, # Vos5:1, # Pedro8:7, # Juan3:4 # Carla}# Lista para saber quién está dentro del ascensor(guardamos sus destinos)pasajeros_dentro =[]# El ciclo continúa mientras haya gente esperando O gente dentro del ascensor
while solicitudes or pasajeros_dentro:print(f"\n--- Piso actual: {piso_actual} (Dirección: {direccion}) ---") # 1.Lógica para DEJARpersonas(Descenso)if piso_actual inpasajeros_dentro: # Quitamos todas las instancias de este piso(por si varias personas bajan aquí)while piso_actual inpasajeros_dentro: pasajeros_dentro.remove(piso_actual)print(f"[PARAR Y DEJAR] Pasajero llegó a su destino.") # 2.Lógica para RECOGERpersonas(Ascenso)if piso_actual insolicitudes: destino_persona = solicitudes[piso_actual] # Determinamos hacia dónde va la persona
direccion_persona ="subir"if destino_persona > piso_actual else"bajar" # REGLADEOPTIMIZACIÓN:Solo recogemos si va en nuestra misma dirección
if direccion_persona == direccion: pasajeros_dentro.append(destino_persona) del solicitudes[piso_actual] # Ya no está esperando en el piso
print(f"[PARAR Y RECOGER] Pasajero sube. Destino: Piso {destino_persona}")else:print(f"[PASAR DE LARGO] Hay alguien esperando para {direccion_persona}, pero yo voy {direccion}.") # 3.Lógica de MOVIMIENTOif direccion =="subir":if piso_actual <10: piso_actual +=1else: direccion ="bajar" piso_actual -=1else: # direccion =="bajar"if piso_actual >1: piso_actual -=1else: direccion ="subir" piso_actual +=1print("\n========================================")print("¡TODOS HAN LLEGADO A SU DESTINO!")print("========================================")
Bueno, aquí yo lo hice en pseudocódigo 😅:
Algoritmo ascensor
Dimension viajes[4,3]//Fabiola viajes[0,0]=2//punto de partida viajes[0,1]=10//punto de destino viajes[0,2]=1//#persona//Carla viajes[1,0]=3//punto de partida viajes[1,1]=4//punto de destino viajes[1,2]=2//#persona//Pedro viajes[2,0]=5//punto de partida viajes[2,1]=1//punto de destino viajes[2,2]=3//#persona//Juana viajes[3,0]=8//punto de partida viajes[3,1]=7//punto de destino viajes[3,2]=4//#persona nro_parada =0 nro_subida =0 nro_bajada =0 nro_personas_ascensor =0 nro_trayecto =1Mientras nro_trayecto <=2HacerSi nro_trayecto MOD2=0Entonces//el ascensor baja punto_inicial =10 punto_termino =1 nro_bajada_x_trayecto =0Para j desde punto_inicial hasta punto_termino HacerSi nro_personas_ascensor >0EntoncesPara i desde 0 hasta 3HacerSi viajes[i,0]> viajes[i,1]Y viajes[i,1]== j Entonces nro_bajada = nro_bajada +1 nro_bajada_x_trayecto = nro_bajada_x_trayecto +1 nro_parada = nro_parada +1 nro_personas_ascensor = nro_personas_ascensor -1FinSiFinParaFinSiFinParaEscribir"Trayecto #: ", nro_trayecto
Escribir"En este trayecto bajan: ", nro_bajada_x_trayecto," personas"Escribir"Con el trayecto de bajada ya van bajando del ascensor un total de: ", nro_bajada
Escribir"Con el trayecto de bajada el ascensor ya va parando un total de: ", nro_parada
Escribir"La cantidad de personas en el ascensor ahora es de: ", nro_personas_ascensor
SiNo//el ascensor sube punto_inicial =1 punto_termino =10 nro_subida_x_trayecto =0 nro_bajada_x_trayecto =0Para j desde punto_inicial hasta punto_termino HacerSi viajes[0,0]== j O viajes[1,0]== j O viajes[2,0]== j O viajes[3,0]== j Entonces nro_subida = nro_subida +1 nro_subida_x_trayecto = nro_subida_x_trayecto +1Si nro_subida >1EntoncesPara i desde 0 hasta 3HacerSi viajes[i,0]< viajes[i,1]Y viajes[i,1]== j Entonces nro_bajada = nro_bajada +1 nro_bajada_x_trayecto = nro_bajada_x_trayecto +1 nro_parada = nro_parada +0FinSiFinParaFinSi nro_parada = nro_parada +1 nro_personas_ascensor = nro_subida - nro_bajada
SiNoSi nro_personas_ascensor >0EntoncesPara i desde 0 hasta 3HacerSi viajes[i,0]< viajes[i,1]Y viajes[i,1]== j Entonces nro_bajada = nro_bajada +1 nro_bajada_x_trayecto = nro_bajada_x_trayecto +1 nro_parada = nro_parada +1FinSiFinPara nro_personas_ascensor = nro_subida - nro_bajada
FinSiFinSiFinParaEscribir"Trayecto #: ", nro_trayecto
Escribir"En este trayecto suben: ", nro_subida_x_trayecto," personas"Escribir"Con el trayecto de subida ya van subiendo un total de personas: ", nro_subida
Escribir"En este trayecto bajan: ", nro_bajada_x_trayecto," personas"Escribir"Con el trayecto de subida ya van bajando un total de personas: ", nro_bajada
Escribir"La cantidad de paradas que está teniendo el ascensor hasta el momento: ", nro_parada
Escribir"La cantidad de personas en el ascensor hasta el momento: ", nro_personas_ascensor
FinSi nro_trayecto = nro_trayecto +1FinMientrasFinAlgoritmo
Desafio del elevador resuelto
Algoritmo desafio_elevador
piso_inicial =1 piso_final =10 tiempo_paradas_subida =0 tiempo_paradas_bajada =0 tiempo_movimiento_por_piso =1 respuesta_usuario =''// 1. TRAYECTO DE SUBIDAMientras piso_inicial <10HacerEscribir"El ascensor está en el piso ", piso_inicial," y va a subir."Escribir"¿Alguien se sube/baja en este piso? (0 para No, 1 para Si):"Leer respuesta_usuario
Si respuesta_usuario =='1'Entonces tiempo_paradas_subida = tiempo_paradas_subida +2FinSi piso_inicial = piso_inicial +1FinMientras tiempo_total_subida =(10* tiempo_movimiento_por_piso)+ tiempo_paradas_subida
Escribir"--- El ascensor llegó al tope. Tiempo de subida: ", tiempo_total_subida," segundos. ---"Escribir""// 2. TRAYECTO DE BAJADAMientras piso_final >0HacerEscribir"El ascensor está en el piso ", piso_final," y va a descender."Escribir"¿Alguien se sube/baja en este piso? (0 para No, 1 para Si):"Leer respuesta_usuario
Si respuesta_usuario =='1'Entonces tiempo_paradas_bajada = tiempo_paradas_bajada +2FinSi piso_final = piso_final -1FinMientras// El tiempo de bajada tiempo_total_bajada =(10* tiempo_movimiento_por_piso)+ tiempo_paradas_bajada
Escribir"--- El ascensor regresó a la planta baja. Tiempo de bajada: ", tiempo_total_bajada," segundos. ---"Escribir""// RESULTADO FINAL tiempo_total_recorrido = tiempo_total_subida + tiempo_total_bajada
Escribir'El tiempo total de todo el recorrido del ascensor es de: ', tiempo_total_recorrido,' segundos.'FinAlgoritmo
# -----------------------------
# Datos del problema
# -----------------------------
pasajeros = [
{"nombre": "Vos", "origen": 2, "destino": 10},
{"nombre": "Pedro", "origen": 5, "destino": 1},
{"nombre": "Juan", "origen": 8, "destino": 7},
{"nombre": "Carla", "origen": 3, "destino": 4}
]
ascensor_pos = 1
paradas = []
# -----------------------------
# Clasificación por dirección
# -----------------------------
ascendentes = [p for p in pasajeros if p["origen"] < p["destino"]]
descendentes = [p for p in pasajeros if p["origen"] > p["destino"]]
# Ordenar por cercanía
ascendentes.sort(key=lambda p: p["origen"]) # origen ascendente
descendentes.sort(key=lambda p: p["origen"], reverse=True) # origen descendente
# -----------------------------
# Función para mover el ascensor
# -----------------------------
def mover_a(piso):
global ascensor_pos
if ascensor_pos != piso:
paradas.append(piso)
ascensor_pos = piso
# -----------------------------
# Recorrido ascendente
# -----------------------------
for p in ascendentes:
mover_a(p["origen"]) # recoger
for p in ascendentes:
mover_a(p["destino"]) # dejar
# -----------------------------
# Recorrido descendente
# -----------------------------
for p in descendentes:
mover_a(p["origen"]) # recoger
for p in descendentes:
mover_a(p["destino"]) # dejar
# -----------------------------
# Resultado final
# -----------------------------
print("Secuencia de paradas del ascensor:")
print(paradas)
from dataclasses importdataclassfrom typing importList,Dict,Tuple@dataclass(frozen=True)classRequest:name: str
origin: int
destination: int
def plan_scan_route(requests:List[Request],start_floor: int =1,building_floors: int =10,)->Tuple[List[int],List[str]]:"""
Planifica una ruta tipo SCAN:1)SUBIR: parar en floors de ORIGEN para recoger.(Opcionalmente podrías permitir dropoffs 'hacia arriba' aquí.)2)Ir al máximo destino/origen relevante hacia arriba.3)BAJAR: parar en destinos en orden descendente, terminar en start_floor.Devuelve:- lista de paradas(floors)- log de eventos(strings)"""
# Validaciones básicas
for r inrequests:ifnot(1<= r.origin<= building_floors and 1<= r.destination<= building_floors): raise ValueError(f"Request fuera de rango: {r}")if r.origin== r.destination: raise ValueError(f"Origen y destino iguales no tiene sentido: {r}")waiting_by_floor:Dict[int,List[Request]]={}for r inrequests: waiting_by_floor.setdefault(r.origin,[]).append(r)onboard:List[Request]=[]stops:List[int]=[start_floor]events:List[str]=[f"Inicio en piso {start_floor}"] # Pisos de pickup por encima del start
pickup_floors_up =sorted([f for f in waiting_by_floor.keys()if f >= start_floor]) # Para asegurar que sí o sí alcanzamos el máximo que necesitamos hacia arriba: # (máximo entre pickups y destinos) max_needed =max([start_floor]+[r.originfor r in requests]+[r.destinationfor r in requests]) # SUBIR: recoger en pisos de origen
current = start_floor
for f inpickup_floors_up:if f < current:continueif f != current: current = f
stops.append(current)
# recoger
if current inwaiting_by_floor:for r in waiting_by_floor[current]: onboard.append(r) events.append(f"Pickup: {r.name} en piso {r.origin} -> destino {r.destination}") del waiting_by_floor[current] # Subir hasta max_needed si no estamos ahí(ej: destino 10)if current != max_needed: current = max_needed
stops.append(current) # En este punto, hacemos dropoffs SOLO en bajada(orden descendente) events.append(f"Cambio a BAJAR desde piso {current}") # Construir lista de destinos pendientes(de los que llevamos) pending_dropoffs =sorted({r.destinationfor r in onboard}, reverse=True) # Bajar parando en destinos
for d inpending_dropoffs:if d == current: # dropoff inmediato
leaving =[r for r in onboard if r.destination== d] onboard =[r for r in onboard if r.destination!= d]for r inleaving: events.append(f"Dropoff: {r.name} en piso {d}")continue
# bajar a d
current = d
stops.append(current) leaving =[r for r in onboard if r.destination== d] onboard =[r for r in onboard if r.destination!= d]for r inleaving: events.append(f"Dropoff: {r.name} en piso {d}") # Finalmente volver a start_floor(si no quedó allí)if current != start_floor: current = start_floor
stops.append(current) events.append("Fin: todos llegaron a su destino")return stops, events
if __name__ =="__main__": # Tu caso
requests =[Request("Vos", origin=2, destination=10),Request("Pedro", origin=5, destination=1),Request("Juana", origin=8, destination=7),Request("Carla", origin=3, destination=4),] stops, events =plan_scan_route(requests, start_floor=1, building_floors=10)print("Paradas:", stops)print("\nEventos:")for e inevents:print("-", e)
Listo, plantee el siguiente codigo: teniendo en cuenta que se prioriza la dirección, asi que priorice los que suben y luego los que bajan:
# Ascensor - versión simplificada para principiantes
piso = 1
print("El ascensor inicia en el piso", piso)
# SUBIDA
print("\n--- SUBIDA ---")
subida = [
(2, "SL", "recoge"),
(3, "Carla", "recoge"),
(4, "Carla", "baja"),
(10, "SL", "baja")
]
for parada in subida:
piso = parada[0]
nombre = parada[1]
accion = parada[2]
if accion == "recoge":
print("Sube al piso", piso, "y recoge a", nombre)
else:
print(nombre, "baja en el piso", piso)
# BAJADA
print("\n--- BAJADA ---")
bajada = [
(8, "Juan", "recoge"),
(7, "Juan", "baja"),
(5, "Pedro", "recoge"),
(1, "Pedro", "baja")
]
for parada in bajada:
piso = parada[0]
nombre = parada[1]
accion = parada[2]
if accion == "recoge":
print("Baja al piso", piso, "y recoge a", nombre)
else:
print(nombre, "baja en el piso", piso)
print("\nFin del recorrido")
-----------------------------------------
El ascensor inicia en el piso 1
--- SUBIDA ---
Sube al piso 2 y recoge a SL
Sube al piso 3 y recoge a Carla
Carla baja en el piso 4
SL baja en el piso 10
--- BAJADA ---
Baja al piso 8 y recoge a Juan
Juan baja en el piso 7
Baja al piso 5 y recoge a Pedro
Pedro baja en el piso 1
Fin del recorrido
Muy bueno
"Programar no se trata de memorizar sintaxis, sino de pensar de forma lógica" 🙌
En mi caso decidí explorar el uso de Python. Una de las cosas que me costo fue entender toda la lógica del asunto. Para priorizar la velocidad agrupe las subidas primero y luego realizar las solicitudes de bajadas.
#===============================#Ascensor subidas y bajadas#===============================import time
# 1.Leer numero de pisospisos=int(input("Ingrese el numero total de pisos del edificio "))#2. Solicitudessolicitudes=[{"nombre":"Ivan","origen":2,"destino":10},{"nombre":"Pedro","origen":5,"destino":1},{"nombre":"Juan","origen":8,"destino":7},{"nombre":"Carla","origen":3,"destino":4},]#3: Clasificar solicitudessubidas =[]bajadas =[]for s in solicitudes:if s["destino"]> s["origen"]: subidas.append(s)else: bajadas.append(s)#4. Ordenar por recorridosubidas.sort(key=lambda x: x["origen"])bajadas.sort(key=lambda x: x["origen"], reverse=True)print("solicitudes de subida:", subidas)print("solicitudes de bajada:", bajadas)#5. Lista de pasajeros dentro del ascensorpersonas_en_ascensor =[]#6. Simulación de subidaprint("\n--- Ascendiendo---")for piso inrange(1, pisos +1):print(f"\n Ascensor en piso {piso}") time.sleep(0.5)#suben personas en este pisofor s in subidas:if s["origen"]== piso :print(f"🟩 {s['nombre']} entra al ascensor (va al piso {s['destino']})") personas_en_ascensor.append(s)# Bajan personas cuyo destino es este pisofor p in personas_en_ascensor[:]:if p["destino"]== piso :print(f"🟥 {p['nombre']} sale del ascensor (llegó a su destino)") personas_en_ascensor.remove(p)# 7. Simulación de bajadaprint("\n--- ASCENSOR BAJANDO ---")for piso inrange(pisos,0,-1):print(f"\n🚪 Ascensor en piso {piso}") time.sleep(0.5)# Suben personas en este piso que van hacia abajofor s in bajadas:if s["origen"]== piso:print(f"🟩 {s['nombre']} entra al ascensor (va al piso {s['destino']})") personas_en_ascensor.append(s)# Bajan personas cuyo destino es este pisofor p in personas_en_ascensor[:]:if p["destino"]== piso:print(f"🟥 {p['nombre']} sale del ascensor (llegó a su destino)") personas_en_ascensor.remove(p)print("\n✅ Recorrido completado.")