In Elixir, per scegliere un elemento casuale da una struttura dati enumerabile (ad esempio una lista o un intervallo), usiamo Enum.random. Questa funzione sceglie un singolo elemento, e ogni elemento ha la stessa probabilità di essere scelto.
Elixir non ha funzioni proprie per scegliere un numero in virgola mobile casuale. Per farlo, dobbiamo usare Erlang direttamente.
Il codice Elixir viene eseguito nella macchina virtuale BEAM. BEAM fa parte dell'Erlang Run-Time System. Ispirato a Erlang e condividendone l'ambiente di esecuzione, Elixir offre un'ottima interoperabilità con le librerie di Erlang. Questo significa che chi sviluppa in Elixir può usare le librerie di Erlang dal proprio codice Elixir. Anzi, nella comunità Elixir è scoraggiato scrivere librerie Elixir per funzionalità che le librerie di Erlang forniscono già.
Di conseguenza, alcune funzionalità, come le operazioni matematiche o le funzioni per i timer, in Elixir sono disponibili solo tramite Erlang.
La libreria standard di Erlang è disponibile per l'uso nel nostro codice Elixir senza alcun passaggio aggiuntivo.
Le funzioni di Erlang si chiamano allo stesso modo in cui chiamiamo le funzioni di Elixir, con una piccola differenza. I nomi dei moduli Erlang sono atomi in snake_case. Per esempio, per chiamare la funzione pi/0 di Erlang dal modulo math, si scrive:
:math.pi()
# => 3.141592653589793
Le funzioni di Erlang più usate che non hanno un equivalente in Elixir sono:
:timer.sleep/1, che sospende un processo per il numero di millisecondi indicato.:rand.uniform/0, che genera un numero in virgola mobile casuale x, dove 0.0 <= x < 1.0.:io_lib.format/2, che offre la formattazione di stringhe in stile C (usando sequenze di controllo). Con questa funzione, per esempio, potremmo stampare un numero intero in qualsiasi base tra 2 e 36 oppure formattare un numero in virgola mobile con la precisione desiderata. Da notare che questa funzione, come molte funzioni di Erlang, restituisce una charlist.math, che fornisce funzioni matematiche come sin/1, cos/1, log2/1, log10/1, pow/2 e altre ancora.Per scoprire la libreria standard di Erlang, esplora il Manuale di riferimento di STDLIB.
Mary è una grande fan della serie TV Star Trek: The Next Generation. Spesso gioca a giochi di ruolo con carta e penna, in cui lei e i suoi amici fingono di essere l'equipaggio della Starship Enterprise. Il personaggio di Mary è il Capitano Picard, il che significa che deve tenere il diario del capitano. Ama la parte creativa del gioco, ma non sopporta di dover generare dati casuali sul momento.
Aiuta Mary creando dei generatori casuali per i dati che compaiono più spesso nel diario del capitano.
La Starship Enterprise incontra molti pianeti nei suoi viaggi. I pianeti dell'universo di Star Trek sono divisi in categorie in base alle loro proprietà. Per esempio, la Terra è un pianeta di classe M. Tutte le classi planetarie possibili sono: D, H, J, K, L, M, N, R, T e Y.
Implementa la funzione random_planet_class/0. Dovrebbe restituire una delle classi planetarie a caso.
CaptainsLog.random_planet_class()
# => "K"
L'Enterprise (numero di registrazione NCC-1701) non è l'unica astronave in circolazione! Quando si incontra con un'altra astronave, Mary deve registrare nel diario il numero di registrazione di quell'astronave.
I numeri di registrazione iniziano con il prefisso "NCC-" e poi usano un numero da 1000 a 9999 (inclusi).
Implementa la funzione random_ship_registry_number/0 che restituisce un numero di registrazione di un'astronave a caso.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
A cosa serve un diario se non include le date?
Una data stellare è un numero in virgola mobile. Le avventure della Starship Enterprise della prima stagione di The Next Generation si svolgono tra le date stellari 41000.0 e 42000.0. Il «4» sta per il XXIV secolo, il «1» per la prima stagione.
Implementa la funzione random_stardate/0 che restituisce un numero in virgola mobile tra 41000.0 (incluso) e 42000.0 (escluso).
L'implementazione dovrebbe usare una funzione Erlang.
CaptainsLog.random_stardate()
# => 41458.15721310934
Nel diario del capitano, le date stellari vengono di solito arrotondate a una sola cifra decimale.
Implementa la funzione format_stardate/1 che prende un numero in virgola mobile e restituisce una stringa con il numero arrotondato a una sola cifra decimale.
L'implementazione dovrebbe usare una funzione Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.