Track
/
Elixir
Elixir
/
Esercizi
/
Indovina il numero
Indovina il numero

Indovina il numero

Esercizio di apprendimento

Introduzione

Funzioni con più clausole

Elixir favorisce le pratiche del principio Open-Closed permettendo alle funzioni di avere più clausole: invece di una logica di controllo dispersiva e codificata a mano, si possono scrivere funzioni mirate che aggiungono o rimuovono comportamenti con facilità.

Elixir offre le clausole multiple di funzione e le guardie per scrivere:

def number(n) when n == 7 do
  "Awesome, that's my favorite"
end

def number(_n) do
  "That's not my favorite"
end

In fase di esecuzione, Elixir verifica, dall'alto verso il basso del file sorgente, quale clausola di funzione chiamare.

Le variabili non utilizzate vanno precedute da un underscore.

Guardie

Le guardie impediscono a Elixir di chiamare una funzione in base a come le funzioni di guardia valutano gli argomenti. Le guardie iniziano con la parola chiave when, seguita da un'espressione booleana. Le funzioni di guardia sono funzioni speciali che:

  • Devono essere pure e non modificare alcuno stato globale.
  • Devono restituire valori strettamente true o false.

Un elenco delle guardie più comuni si trova nella documentazione di Elixir. Include controlli di tipo, aritmetica di base, confronti e operatori strettamente booleani.

Argomenti predefiniti

Le funzioni possono dichiarare valori predefiniti per uno o più argomenti. Consideriamo questa funzione:

def number(n \\ 13), do: "That's not my favorite"

Al momento della compilazione, Elixir crea una definizione di funzione per number/0 (nessun argomento) e per number/1 (un argomento).

Se più di un argomento ha valori predefiniti, questi vengono applicati alla funzione da sinistra a destra per coprire gli argomenti mancanti.

Se la funzione ha più di una clausola, gli argomenti predefiniti vanno definiti in un'intestazione di funzione (una funzione senza corpo) prima delle clausole della funzione:

def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."

Istruzioni

Stai creando un semplice gioco online in cui un amico può indovinare un numero segreto. Vuoi dare un po' di feedback, ma senza rivelare la risposta con un tentativo. Devi ideare una funzione che fornisca risposte diverse a seconda di come il tentativo si rapporta al numero segreto.

Condizione Risposta
Quando il tentativo coincide con il numero segreto "Correct"
Quando il tentativo è uno in più o uno in meno del numero segreto "So close"
Quando il tentativo è maggiore del numero segreto "Too high"
Quando il tentativo è minore del numero segreto "Too low"
Quando non viene fatto alcun tentativo "Make a guess"

Tutti i tentativi e i numeri segreti sono numeri interi.

1. Genera la risposta quando il tentativo coincide con il numero segreto

Implementa la funzione compare/2, che accetta due argomenti, secret_number e guess, entrambi numeri interi.

GuessingGame.compare(5, 5)
# => "Correct"

2. Genera la risposta quando il tentativo è maggiore del numero segreto

Modifica la funzione compare in modo che risponda ai tentativi più alti del numero segreto.

GuessingGame.compare(5, 8)
# => "Too high"

3. Genera la risposta quando il tentativo è minore del numero segreto

Modifica la funzione compare in modo che risponda ai tentativi più bassi del numero segreto.

GuessingGame.compare(5, 2)
# => "Too low"

4. Genera le risposte quando il tentativo è uno in più o uno in meno del numero segreto

Modifica la funzione compare in modo che risponda ai tentativi vicini al numero segreto.

GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"

5. Genera la risposta quando non c'è alcun tentativo

Modifica la funzione compare in modo che risponda all'assenza di un tentativo.

GuessingGame.compare(5)
# => "Make a guess"

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Indovina il numero?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.