Skip to content

Instantly share code, notes, and snippets.

@hazi98
Last active February 25, 2020 21:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hazi98/4611e469828ef7d0170fcce323f2e23b to your computer and use it in GitHub Desktop.
Save hazi98/4611e469828ef7d0170fcce323f2e23b to your computer and use it in GitHub Desktop.
# Definición de acciones del elevador
ARRIBA = 1
ABAJO = 2
NUM_PISOS = 4
MAX_PERSONAS = 6
ERROR_PERSONAS = -2
ERROR_PISO = -3
class Persona:
# Contador de personas, para asignar un número a cada persona
contador_personas = 0
def __init__(self, piso):
Persona.contador_personas += 1
# Cuando se crea una persona, se le da un nuevo número de persona
self.num_persona = Persona.contador_personas
# Se asigna el piso al que va la persona
self.piso = piso
class Elevador:
# Algoritmo del elevador
# Comenzar a direccionarse hacia donde se presionó el primer botón, tomar en cuenta la dirección hacia la que se va
# Cuando se llega a un piso y el piso fue presionado anteriormente, detenerse y abrir las puertas, y deseleccionar el botón.
# Si se necesitan más pisos por recorrer en la misma dirección, seguir en esa dirección.
# Si ya no quedan pisos por recorrer en dicha dirección, alternar dirección y continuar
def __init__(self):
self.cola = [0]
self.direccion = -1
# El elevador comienza en PB o piso #0
self.piso_actual = -1
# Aqui guardamos las personas dentro del elevador
self.personas = []
self.num_personas = 0
def seleccionar_piso(self, piso):
# Se llama a esta función cuando alguien elige un piso
# Se anexa el piso deseado a la cola de espera, pero se omite si el botón ya estaba presionado
if piso not in self.cola:
self.cola.append(piso)
# Ordenamos la cola para conocer qué pisos se deben de recorrer en la dirección a la que vamos.
self.cola.sort()
def persona_entra(self, persona: Persona):
# Checar si de casualidad la persona no está queriendo entrar al mismo piso
if persona.piso == self.piso_actual:
return ERROR_PISO
elif persona.piso == 0 and self.piso_actual == -1:
return ERROR_PISO
# Cuando una persona entra, se pregunta primero si se puede unir si todavia existe espacio
if self.num_personas < MAX_PERSONAS:
self.num_personas += 1
self.personas.append(persona)
# Si no hay espacio, se rechaza la persona y no entra
else:
return ERROR_PERSONAS
# Si hay espacio, entonces la persona presiona un botón y selecciona un piso.
self.seleccionar_piso(persona.piso)
return 1
def persona_sale(self):
# Cuando se llega a un piso, se checa qué personas deben de bajar
personas_salida = []
for persona in self.personas:
if persona.piso == self.piso_actual:
# Bajar a la persona
print("Se sale la persona no.", persona.num_persona,
" en el piso ", persona.piso)
personas_salida.append(persona)
# Decrementar el contador
self.num_personas -= 1
# Quitar a las personas
for persona in personas_salida:
self.personas.remove(persona)
print("---------------------------------")
return 1
def mover(self):
# Si ya no hay pisos, hemos terminado
if len(self.cola) == 0:
return 0
# Cambio de dirección
# Casos: 1. Al inicio, 2. una persona entra al elevador, 3. si hemos llegado al último piso en una direccion, hay que cambiar de dirección
if self.direccion == -1 or len(self.cola) == 1 or self.piso_actual == self.cola[0] or self.piso_actual == self.cola[-1]:
# Determinar la dirección
if self.piso_actual <= self.cola[0]:
self.direccion = ARRIBA
elif self.piso_actual >= self.cola[-1]:
self.direccion = ABAJO
# Moverse en caso contrario
if self.piso_actual == -1:
if self.direccion == ARRIBA:
self.piso_actual = self.cola[0]
elif self.direccion == ABAJO:
self.piso_actual = self.cola[-1]
indice = self.cola.index(self.piso_actual)
# Cambiar el piso actual al siguiente valor en la dirección deseada en caso de no estar en extremos del elevador
# En caso de estar en extremos, se debió de haber cambiado la dirección
piso_visitado = self.piso_actual
if len(self.cola) == 1:
self.piso_actual = self.cola[0]
else:
if self.direccion == ARRIBA:
self.piso_actual = self.cola[indice + 1]
elif self.direccion == ABAJO:
self.piso_actual = self.cola[indice - 1]
# Quitar de la cola el piso visitado
self.cola.remove(piso_visitado)
# Imprimir acciones
if self.piso_actual == piso_visitado:
print("El elevador termina su funcionamiento en el piso ", piso_visitado)
exit(0)
else:
print("El elevador se mueve del piso ",
piso_visitado, " al ", self.piso_actual)
if self.direccion == ARRIBA:
print("Dirección ARRIBA")
elif self.direccion == ABAJO:
print("Dirección ABAJO")
return 2
# Prueba
elev = Elevador()
fin = -1
print("SIMULACIÓN DE ELEVADOR")
print("Yoltic Jassiel García Guzmán")
print("============================")
print("Comienza a funcionar el elevador desde el piso 0 (PB)")
while fin != 0:
# Input
sel = -1
piso = -1
while sel == -1:
print("============================")
if(elev.piso_actual == -1 or elev.piso_actual == 0):
print("Piso actual: 0 (PB)")
else:
print("Piso actual: ", elev.piso_actual)
print("Personas adentro:", elev.num_personas)
print("OPCIONES:")
print("1. Ingresar a una persona")
print("2. Continuar con la ejecución")
print("3. Salir")
sel = input("Seleccione una opción: \n")
if sel.isdigit() == False:
print("Opción inválida.0")
sel = -1
switcher = {
1: 1,
2: 2,
3: 3,
}
sel = switcher.get(int(sel), -1)
if sel == 1:
# Ingresar a una persona
while piso == -1:
piso = input("Digite el piso al que se dirige (0-3):\n")
switcher2 = {
0: 0,
1: 1,
2: 2,
3: 3,
}
piso = int(switcher2.get(int(piso), -1))
if piso == -1:
print("Opción inválida.")
else:
persona = Persona(piso)
res = elev.persona_entra(persona)
if res == ERROR_PERSONAS:
print("Error: máxima capacidad alcanzada (6 personas)")
elif res == ERROR_PISO:
print(
"Error: la persona se encuentra en el mismo piso que quiere ir.")
elif sel == 2:
fin = elev.mover()
elev.persona_sale()
elif sel == 3:
exit(0)
else:
print("Opción inválida.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment