Percursos
/
Elixir
Elixir
/
Exercícios
/
Diário de bordo do capitão
Diário de bordo do capitão

Diário de bordo do capitão

Exercício de aprendizagem

Introdução

Aleatoriedade

Em Elixir, para escolher um elemento aleatório de uma estrutura de dados enumerável (por exemplo, uma lista ou um intervalo), usamos Enum.random. Esta função escolhe um único elemento, e todos os elementos têm a mesma probabilidade de serem escolhidos.

O Elixir não tem funções próprias para escolher um número de vírgula flutuante aleatório. Para isso, temos de usar o Erlang diretamente.

Bibliotecas Erlang

O código Elixir corre na máquina virtual BEAM. O BEAM faz parte do sistema de execução do Erlang. Inspirado pelo Erlang e partilhando o seu ambiente de execução, o Elixir oferece uma excelente interoperabilidade com as bibliotecas Erlang. Isto significa que os programadores de Elixir podem usar bibliotecas Erlang a partir do seu código Elixir. De facto, escrever bibliotecas Elixir para funcionalidades que as bibliotecas Erlang já fornecem é desencorajado na comunidade Elixir.

Como resultado, certas funcionalidades, como operações matemáticas ou funções de temporização, só estão disponíveis em Elixir através do Erlang.

A biblioteca padrão do Erlang está disponível para uso no nosso código Elixir, sem passos adicionais.

As funções Erlang podem ser chamadas da mesma forma que chamamos as funções Elixir, com uma pequena diferença. Os nomes dos módulos Erlang são átomos em snake_case. Por exemplo, para chamar a função pi/0 do Erlang a partir do módulo math, escreverias:

:math.pi()
# => 3.141592653589793

As funções Erlang mais usadas que não têm equivalente em Elixir são:

  • :timer.sleep/1, que suspende um processo durante o número de milissegundos indicado.
  • :rand.uniform/0, que gera um número de vírgula flutuante aleatório x, em que 0.0 <= x < 1.0.
  • :io_lib.format/2, que fornece formatação de strings ao estilo C (usando sequências de controlo). Com esta função, podíamos, por exemplo, imprimir um número inteiro em qualquer base entre 2 e 36 ou formatar um número de vírgula flutuante com a precisão desejada. Nota que esta função, como muitas funções Erlang, devolve uma charlist.
  • O módulo math, que fornece funções matemáticas como sin/1, cos/1, log2/1, log10/1, pow/2, entre outras.

Para descobrir a biblioteca padrão do Erlang, explora o Manual de Referência da STDLIB.

Instruções

A Mary é uma grande fã da série de televisão Star Trek: The Next Generation. Muitas vezes joga jogos de interpretação de papel e lápis, onde ela e os amigos fingem ser a tripulação da Starship Enterprise. A personagem da Mary é o Capitão Picard, o que significa que ela tem de manter o diário de bordo do capitão. Ela adora a parte criativa do jogo, mas não gosta de gerar dados aleatórios no momento.

Ajuda a Mary a criar geradores aleatórios para dados que aparecem frequentemente no diário de bordo do capitão.

1. Gera um planeta aleatório

A Starship Enterprise encontra muitos planetas nas suas viagens. Os planetas no universo de Star Trek são divididos em categorias com base nas suas propriedades. Por exemplo, a Terra é um planeta de classe M. Todas as classes planetárias possíveis são: D, H, J, K, L, M, N, R, T e Y.

Implementa a função random_planet_class/0. Deve devolver uma das classes planetárias aleatoriamente.

CaptainsLog.random_planet_class()
# => "K"

2. Gera um número de registo aleatório para a nave estelar

A Enterprise (número de registo NCC-1701) não é a única nave estelar a voar por aí! Quando se encontra com outra nave estelar, a Mary precisa de registar o número de registo dessa nave.

Os números de registo começam com o prefixo "NCC-" e depois usam um número de 1000 a 9999 (inclusive).

Implementa a função random_ship_registry_number/0 que devolve um número de registo de nave estelar aleatório.

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

3. Gera uma data estelar aleatória

Qual é a utilidade de um diário de bordo se não incluir datas?

Uma data estelar é um número de vírgula flutuante. As aventuras da Starship Enterprise da primeira temporada de The Next Generation ocorrem entre as datas estelares 41000.0 e 42000.0. O "4" representa o século XXIV, o "1" a primeira temporada.

Implementa a função random_stardate/0 que devolve um número de vírgula flutuante entre 41000.0 (inclusive) e 42000.0 (exclusive).

A implementação deve usar uma função Erlang.

CaptainsLog.random_stardate()
# => 41458.15721310934

4. Formata a data estelar

No diário de bordo do capitão, as datas estelares são geralmente arredondadas a uma única casa decimal.

Implementa a função format_stardate/1 que recebe um número de vírgula flutuante e devolve uma string com o número arredondado a uma única casa decimal.

A implementação deve usar uma função Erlang.

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Diário de bordo do capitão?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.