2

#PlatziCodingChallenge - Doble elevador doble eficiencia?

Mejorando aún más tu elevador inicial, ya que se ha quedado corto para un edificio de 10 pisos y muchas familias. Por lo que la administración decide activar un segundo elevador.
Crea el algoritmo que maneje 2 elevadores.

Recuerda dejar tu código dentro del sistema de comentarios 😉

Link del reto

Escribe tu comentario
+ 2
2
19943Puntos

Doble Elevador en JavaScript
https://cristianiniguez.github.io/PlatziCodingChallenge/PlatziCodingChallenge_Dia66/

// Doble elevador en JavaScript// Estados de las tareasconst SIN_ATENDER = 0const ATENDIDA = 1// Direcciones del elevadorconst HACIA_ARRIBA = 1const HACIA_ABAJO = -1const QUIETO = 0classElevador{
  constructor($info, $numbers) {
    this.$info = $info
    this.$numbers = $numbers

    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() {
    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 bajadas
    tareasFinalizadas.forEach(i => {
      this.tareas.splice(i, 1)
    })
    this.establecerDireccion()
    this.imprimirEstado()
    if (this.direccion !== QUIETO) {
      // Calculando tiempo de esperalet delay = 2000 + (subidas > 0 ? 5000 : 0) + (bajadas > 0 ? 5000 : 0);
      setTimeout(this.mover, delay)
    }
  }
  imprimirEstado() {
    this.$numbers.forEach($np => {
      $np.innerText = this.piso
      $np.style.color = $np.id === `floor-${this.piso}` ? 'lime' : 'red'
    })
    this.$info.querySelector('#elevator-number').innerText = this.piso
    let $estado = this.$info.querySelector('#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)
    ))
  }
}

// Cuadros de información y numeros de los elevadoresconst $infoElevador1 = document.getElementById('info-elevator-1')
const $infoElevador2 = document.getElementById('info-elevator-2')
const $numbersElevador1 = document.querySelectorAll('.floor__elevator1-number')
const $numbersElevador2 = document.querySelectorAll('.floor__elevator2-number')

// Creación de los 2 elevadoresconst elevador1 = new Elevador($infoElevador1, $numbersElevador1)
const elevador2 = new Elevador($infoElevador2, $numbersElevador2)

// Botones de los ascensoresconst $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)) {
    const elevador = escogerElevador(pisoInicial)
    elevador.nuevaTarea(pisoInicial, pisoFinal)
  } else {
    alert('Piso final no válido')
  }
}

functionescogerElevador(pisoInicial) {
  const elevadores = [elevador1, elevador2]
  let elevEscogido
  // Qué elevador está quieto
  elevEscogido = elevadores.find(elev => elev.direccion === QUIETO)
  if (elevEscogido) { return elevEscogido }
  // Qué elevador está mas cerca de pasar por el piso
  elevEscogido = elevadores.find(elev => (
    (elev.piso > pisoInicial && elev.direccion === HACIA_ABAJO)
    || (elev.piso < pisoInicial && elev.direccion === HACIA_ARRIBA)
    || (elev.piso === pisoInicial)
  ))
  if (elevEscogido) { return elevEscogido }
  // Al finalreturn elevadores[0]
}