Rutas
/
Elixir
Elixir
/
Ejercicios
/
Diario del capitán
Diario del capitán

Diario del capitán

Ejercicio de aprendizaje

Introducción

Aleatoriedad

En Elixir, para elegir un elemento aleatorio de una estructura de datos enumerable (por ejemplo, una lista, un rango), usamos Enum.random. Esta función elige un único elemento, teniendo cada elemento la misma probabilidad de ser elegido.

Elixir no tiene funciones propias para elegir un número decimal aleatorio. Para hacer eso, tenemos que usar Erlang directamente.

Bibliotecas de Erlang

El código de Elixir se ejecuta en la máquina virtual BEAM. BEAM es parte del sistema de tiempo de ejecución de Erlang. Inspirado en Erlang y compartiendo su entorno de ejecución, Elixir ofrece una gran interoperabilidad con las bibliotecas de Erlang. Esto significa que los desarrolladores de Elixir pueden usar bibliotecas de Erlang desde dentro de su código Elixir. De hecho, en la comunidad de Elixir se desaconseja escribir bibliotecas de Elixir para funcionalidades que ya proporcionan las bibliotecas de Erlang.

Como resultado, ciertas funcionalidades, como las operaciones matemáticas o las funciones de temporizador, solo están disponibles en Elixir a través de Erlang.

La biblioteca estándar de Erlang está disponible para usarse en nuestro código Elixir sin necesidad de pasos adicionales.

Las funciones de Erlang se pueden llamar de la misma manera en que llamamos a las funciones de Elixir, con una pequeña diferencia. Los nombres de los módulos de Erlang son átomos en snake_case. Por ejemplo, para llamar a la función pi/0 de Erlang desde el módulo math, se escribiría:

:math.pi()
# => 3.141592653589793

Las funciones de Erlang más utilizadas que no tienen un equivalente en Elixir son:

  • :timer.sleep/1, que suspende un proceso durante la cantidad de milisegundos indicada.
  • :rand.uniform/0, que genera un número decimal aleatorio x, donde 0.0 <= x < 1.0.
  • :io_lib.format/2, que proporciona formato de cadenas al estilo de C (usando secuencias de control). Con esta función, podríamos, por ejemplo, imprimir un número entero en cualquier base entre 2 y 36 o formatear un número decimal con la precisión deseada. Ten en cuenta que esta función, como muchas funciones de Erlang, devuelve un charlist.
  • El módulo math, que proporciona funciones matemáticas como sin/1, cos/1, log2/1, log10/1, pow/2 y más.

Para descubrir la biblioteca estándar de Erlang, explora el Manual de referencia de STDLIB.

Instrucciones

Mary es una gran fan de la serie de televisión Star Trek: The Next Generation. A menudo juega a juegos de rol de lápiz y papel, en los que ella y sus amigos fingen ser la tripulación de la Starship Enterprise. El personaje de Mary es el capitán Picard, lo que significa que tiene que llevar el diario del capitán. Le encanta la parte creativa del juego, pero no le gusta generar datos aleatorios sobre la marcha.

Ayuda a Mary creando generadores aleatorios para los datos que aparecen habitualmente en el diario del capitán.

1. Genera un planeta aleatorio

La Starship Enterprise se encuentra con muchos planetas en sus viajes. Los planetas del universo de Star Trek se dividen en categorías según sus propiedades. Por ejemplo, la Tierra es un planeta de clase M. Todas las clases planetarias posibles son: D, H, J, K, L, M, N, R, T y Y.

Implementa la función random_planet_class/0. Debe devolver una de las clases planetarias al azar.

CaptainsLog.random_planet_class()
# => "K"

2. Genera un número de registro de nave estelar aleatorio

La Enterprise (número de registro NCC-1701) no es la única nave estelar que surca el espacio. Cuando se encuentra con otra nave estelar, Mary necesita anotar el número de registro de esa nave.

Los números de registro empiezan por el prefijo «NCC-» y continúan con un número del 1000 al 9999 (ambos incluidos).

Implementa la función random_ship_registry_number/0, que devuelve un número de registro de nave estelar aleatorio.

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. Genera una fecha estelar aleatoria

¿De qué sirve un diario si no incluye fechas?

Una fecha estelar es un número de coma flotante. Las aventuras de la Starship Enterprise de la primera temporada de The Next Generation transcurren entre las fechas estelares 41000,0 y 42000,0. El «4» representa el siglo XXIV y el «1», la primera temporada.

Implementa la función random_stardate/0, que devuelve un número de coma flotante entre 41000,0 (incluido) y 42000,0 (excluido).

La implementación debe usar una función de Erlang.

CaptainsLog.random_stardate()
# => 41458.15721310934

4. Da formato a la fecha estelar

En el diario del capitán, las fechas estelares suelen redondearse a un solo decimal.

Implementa la función format_stardate/1, que toma un número de coma flotante y devuelve un string con el número redondeado a un solo decimal.

La implementación debe usar una función de Erlang.

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Diario del capitán?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.