Track
/
Gleam
Gleam
/
Esercizi
/
Indovina il numero
Indovina il numero

Indovina il numero

Esercizio di apprendimento

Introduzione

Espressioni case

In Gleam un'espressione case può essere usata per eseguire del codice in modo condizionale. Con un'espressione case un valore può essere confrontato con uno o più pattern. Un esempio di tale pattern è il pattern letterale, che confronta un valore con un valore letterale (ad esempio 1 o "hello").

Le espressioni case si scrivono con la parola chiave case:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

Anche se questo può sembrare simile alle istruzioni switch di altri linguaggi, il pattern matching dà il meglio di sé quando si usano anche altri pattern. Uno di questi pattern è il pattern variabile, che permette di assegnare un valore a una variabile. In questo esempio, alla variabile i verrà assegnato il valore di number se non è 0:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

In alcuni casi potresti voler aggiungere una condizione ulteriore a un pattern. Questa è nota come guardia (clausola) e si può aggiungere usando la parola chiave if:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

Per motivi di prestazioni, nelle guardie sono ammessi solo gli operatori matematici e booleani di base: non è possibile usare altre funzioni nelle guardie.

Nell'esempio sopra, non tutti gli input possibili avranno un pattern corrispondente. Il compilatore lo rileva e segnala un errore. Questo si chiama controllo di esaustività. Per risolvere l'avviso, bisogna gestire tutti i casi. Per questo si può usare il pattern jolly, che è un pattern che corrisponde a qualsiasi valore:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

In una stessa clausola si possono confrontare più pattern, usando | per separarli. A una clausola si può aggiungere una sola guardia:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

Le espressioni case confrontano un valore con ciascun pattern dall'alto verso il basso, finché non trovano un pattern corrispondente ed eseguono la logica associata a quel pattern. L'ordine dei pattern è importante!

Istruzioni

In questo esercizio, giocherai a indovinare un numero con un amico. Le regole sono semplici: scegli in segreto un numero tra 1 e 100 e il tuo amico prova a indovinare quale numero hai scelto. Per aiutare il tuo amico, rispondi in modo diverso a seconda di quanto il tentativo si avvicina al numero che hai scelto (42). Queste sono le regole per le diverse risposte:

  • Se il tentativo è 42: "Correct"
  • Se il tentativo è 41 o 43: "So close"
  • Se il tentativo è minore di 41: "Too low"
  • Se il tentativo è maggiore di 43: "Too high"

Hai quattro attività per codificare le risposte ai tentativi.

1. Rispondi a un tentativo corretto

Implementa la funzione reply per rispondere a un tentativo corretto:

reply(42)
// -> "Correct"

2. Rispondi a un tentativo vicino

Modifica la funzione reply per rispondere ai tentativi vicini:

reply(41)
// -> "So close"

3. Rispondi ai tentativi troppo bassi

Modifica la funzione reply per rispondere ai tentativi troppo bassi:

reply(25)
// -> "Too low"

4. Rispondi ai tentativi troppo alti

Modifica la funzione reply per rispondere ai tentativi troppo alti:

reply(88)
// -> "Too high"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Gleam Exercism

Vuoi iniziare Indovina il numero?

Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.