Powered by AppSignal & Oban Pro

Habitación 7: Ordenar Números de Lista

space_station/solutions/08.livemd

Habitación 7: Ordenar Números de Lista

Mix.install([
  {:explorer, "~> 0.11.1"},
  {:kino, "~> 0.19.0"},
  {:kino_explorer, "~> 0.1.25"},
  {:kino_vega_lite, "~> 0.1.13"},
  {:helpers, path: Path.expand("../helpers", __DIR__)}
])

defmodule Room do
  require Explorer.DataFrame, as: DF

  def verify(answer) do
    case answer do
        [150, 375, 890] -> Helpers.Messages.correct(
            "09.livemd",
            "¡Muy bien!, Es el valor buscado."
        )

      _ -> Helpers.Messages.error(
            "No es la respuesta correcta. Inténtalo nuevamente."
        )
    end
    |> Kino.Markdown.new()
  end
end

Contexto

Desde el módulo de control, detectan múltiples objetos orbitando alrededor de la estación espacial ⚠️.

Es urgente analizar sus coordenadas para prevenir colisiones 🌌💥.

Desafío de la habitación

🚀 Ordena y extrae los tres siguientes datos clave:

  • El objeto más cercano a la estación.
  • El objeto más lejano.
  • El objeto que se encuentra en el centro de la lista (una vez ordenada).

Ordena la lista ocupando la función Enum.sort/1 y utilizando los índices necesarios para crear una nueva lista con las coordenadas requeridas.

💡¿Cómo se obtiene el valor del centro?

El valor del centro depende del largo de la lista:

  • Si el largo de la lista es un número par: Es el valor entero del promedio de los valores que están al medio. Es decir si la lista tiene 6 números: [1, 2, 3, 4, 5, 6] el valor será del promedio de los números 3 (posición 2) y 2 (posición 1) (2.5, sacando el entero sería 2).

  • Si el lago de la lista es un número impar: Es el valor de al medio.

largo = Enum.count(lista)
valor = Enum.at(lista, div(largo, 2)) # Para lista con largo impar

La operación div(largo, 2) es una división que obtiene sólo el valor entero del resultado.

Si es div(7, 2) obtiene el valor de 3.

Establece tu respuesta

coordenadas =
    [540, 320, 890, 150, 430, 270]
    |> Enum.sort()
count = Enum.count(coordenadas)

valor_medio =
  if rem(count, 2) == 0 do
    largo = div(count,  2)
    (Enum.at(coordenadas, largo - 1) + Enum.at(coordenadas, largo))
    |> div(2)
  else
    Enum.at(coordenadas, div(count, 2))
  end

respuesta = [
    Enum.at(coordenadas, 0),
    valor_medio,
    Enum.at(coordenadas, -1)
]

Verifica tu respuesta

Room.verify(respuesta)