2

#PlatziCodingChallenge - Programar un elevador

Crea un algoritmo que le permita a los residentes de un edificio de 10 pisos utilizar su elevador para cambiar de pisos con los siguientes requerimientos:

Botones:

  • Cada piso tiene un botón para subir y otro para bajar. Ambos se pueden activar en el mismo piso.
  • Cuando se presiona un botón, aparece otro menú para seleccionar el piso al que se desea ir. Si presionas arriba, este menú solo debe mostrar los pisos arriba del actual. Y si presionas abajo, solo muestra los pisos debajo del actual.
  • El primer piso de arriba no puede seleccionar el botón de ir hacia abajo. Y el última piso no puede ir hacia arriba.
  • Los residentes no pueden subir y bajar en el mismo piso.
  • Si el elevador atiende un piso porque va en una cierta dirección (digamos, hacía arriba), pero el piso tiene los botones de ambas direcciones activados, la dirección que no se está atendiendo actualmente (en este caso, abajo) debe seguir “pendiente”.

Cómo decide el elevador a qué pisos atender primero (órden):

  • Prioridad 1: dependiendo de la dirección en la que se dirige actualmente el elevador (recuerda que también puede estar quieto)
  • Prioridad 2: dependiendo de qué piso se encuentra más cerca (recuerda que aplica tanto para recoger residentes como para dejarlos en el piso que desean)
  • Cada piso puede presionar sus botones en cualquier momento y el elevador debe evaluarlos “en tiempo real” y evaluarlos sin discriminar, es decir, sin importar si presionan el botón mientras el elevador está quieto, subiendo, bajando o atendiendo a personas de otros pisos.

Tiempo:

  • El elevador tarda 2 segundos en subir o bajar cada piso.
  • El elevador tarda 5 segundos en atender a las personas que quieren entrar.
  • El elevador también tarda 5 segundos en atender a las personas que quieren bajar.
  • Si hay personas que suben y bajan en el mismo piso, se debe sumar el tiempo en que bajan y suben (10 segundos).
Escribe tu comentario
+ 2
2
19943Puntos

Programar un elevador en JavaScript (implementado en una página web):
https://cristianiniguez.github.io/PlatziCodingChallenge/PlatziCodingChallenge_Dia64/

<body><main><h1>Programar un elevador</h1><divclass="container grid-container"><divclass="info-container"><h2>Estado del elevador</h2><p>Piso: <spanid="elevator-number">0</span></p><p>Dirección: <spanid="elevator-state">Quieto</span></p></div><divclass="floors-container"><divclass="floor"><p>Piso 9</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="9"data-direccion="-1"></i></div><divclass="floor__elevator-number"id="floor-9">0</div></div><divclass="floor"><p>Piso 8</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="8"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="8"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-8">0</div></div><divclass="floor"><p>Piso 7</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="7"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="7"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-7">0</div></div><divclass="floor"><p>Piso 6</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="6"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="6"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-6">0</div></div><divclass="floor"><p>Piso 5</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="5"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="5"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-5">0</div></div><divclass="floor"><p>Piso 4</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="4"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="4"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-4">0</div></div><divclass="floor"><p>Piso 3</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="3"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="3"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-3">0</div></div><divclass="floor"><p>Piso 2</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="2"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="2"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-2">0</div></div><divclass="floor"><p>Piso 1</p><divclass="floor__buttons"><iclass="fas fa-arrow-down"data-piso="1"data-direccion="-1"></i><iclass="fas fa-arrow-up"data-piso="1"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-1">0</div></div><divclass="floor"><p>Piso 0</p><divclass="floor__buttons"><iclass="fas fa-arrow-up"data-piso="0"data-direccion="1"></i></div><divclass="floor__elevator-number"id="floor-0">0</div></div></div></div></main><scriptsrc="Elevador.js"></script></body>
// Programar un elevador en JavaScript// Estados de las tareasconst SIN_ATENDER = 0const ATENDIDA = 1// Direcciones del elevadorconst HACIA_ARRIBA = 1const HACIA_ABAJO = -1const QUIETO = 0classElevador{
  constructor() {
    this.mover = this.mover.bind(this)
    this.piso = 0this.direccion = QUIETO
    this.tareas = newArray()
    this.imprimirEstado()
  }
  nuevaTarea(pisoInicial, pisoFinal) {
    this.tareas.push({ pisoInicial, pisoFinal, estado: SIN_ATENDER })
    if (this.direccion === QUIETO) { // El elevador está quieto?this.manejarPiso()
    }
  }
  establecerDireccion() {
    if (this.hayTareasArriba()) {
      this.direccion = HACIA_ARRIBA
    } elseif (this.hayTareasAbajo()) {
      this.direccion = HACIA_ABAJO
    } else {
      this.direccion = QUIETO
    }
  }
  mover() {
    console.log(this)
    switch (this.direccion) { // Moviendome un piso hacia arriba o hacia abajocase HACIA_ARRIBA: this.piso++; break;
      case HACIA_ABAJO: this.piso--; break;
      default: 'Algo anda mal'
    }
    this.manejarPiso()
  }
  manejarPiso() {
    let tareasFinalizadas = newArray()
    let subidas = 0, bajadas = 0for (let i = 0; i < this.tareas.length; i++) { // Para cada tareaconst tarea = this.tareas[i];
      if (tarea.pisoInicial === this.piso && tarea.estado === SIN_ATENDER) { // Si hay gente subiendo
        tarea.estado = ATENDIDA
        subidas++
      }
      if (tarea.pisoFinal === this.piso && tarea.estado === ATENDIDA) { // Si hay gente bajando
        tareasFinalizadas.push(i)
        bajadas++
      }
    }
    // Eliminando bajadasconsole.log(tareasFinalizadas)
    tareasFinalizadas.forEach(i => {
      this.tareas.splice(i, 1)
    })
    this.establecerDireccion()
    this.imprimirEstado()
    console.log(this)
    if (this.direccion !== QUIETO) {
      // Calculando tiempo de esperalet delay = 2000 + (subidas > 0 ? 5000 : 0) + (bajadas > 0 ? 5000 : 0);
      setTimeout(this.mover, delay)
    }
  }
  imprimirEstado() {
    const $numerosPisos = document.querySelectorAll('.floor__elevator-number')
    $numerosPisos.forEach($np => {
      $np.innerText = this.piso
      $np.style.color = $np.id === `floor-${this.piso}` ? 'lime' : 'red'
    })
    document.getElementById('elevator-number').innerText = this.piso
    let $estado = document.getElementById('elevator-state')
    switch (this.direccion) {
      case QUIETO: $estado.innerText = 'Quieto'; break;
      case HACIA_ARRIBA: $estado.innerText = 'Hacia arriba'; break;
      case HACIA_ABAJO: $estado.innerText = 'Hacia abajo'; break;
    }
  }
  hayTareasArriba() {
    returnthis.tareas.some(tarea => (
      (tarea.pisoInicial >= this.piso && tarea.estado === SIN_ATENDER)
      || (tarea.pisoFinal > this.piso && tarea.estado === ATENDIDA)
    ))
  }
  hayTareasAbajo() {
    returnthis.tareas.some(tarea => (
      (tarea.pisoInicial <= this.piso && tarea.estado === SIN_ATENDER)
      || (tarea.pisoFinal < this.piso && tarea.estado === ATENDIDA)
    ))
  }
}

const miElevador = new Elevador()

const $btnsUp = document.querySelectorAll('.fa-arrow-up')
const $btnsDown = document.querySelectorAll('.fa-arrow-down')

$btnsUp.forEach($btn => {
  $btn.addEventListener('click', obtenerTarea)
})
$btnsDown.forEach($btn => {
  $btn.addEventListener('click', obtenerTarea)
})
functionobtenerTarea(e) {
  let pisoInicial = parseInt(e.target.dataset.piso)
  let direccion = parseInt(e.target.dataset.direccion)
  let destinos = newArray()
  switch (direccion) {
    case1:
      for (let i = pisoInicial + 1; i <= 9; i++) {
        destinos.push(i)
      }
      break;
    case-1:
      for (let i = 0; i <= pisoInicial - 1; i++) {
        destinos.push(i)
      }
      break;
  }
  let pisoFinal = parseInt(prompt(`¿A qué piso quiere ir?\n${destinos}`))
  if (destinos.some(d => d === pisoFinal)) {
    miElevador.nuevaTarea(pisoInicial, pisoFinal)
  } else {
    alert('Piso final no válido')
  }
}