Trilhas
/
Gleam
Gleam
/
Exercícios
/
Jogo de adivinhação
Jogo de adivinhação

Jogo de adivinhação

Exercício de aprendizagem

Introdução

Expressões case

No Gleam, uma expressão case pode ser usada para executar código condicionalmente. Com uma expressão case, um valor pode ser testado contra um ou mais padrões. Um exemplo desse tipo de padrão é o padrão literal, que compara um valor com um valor literal (por exemplo, 1 ou "hello").

As expressões case são escritas com a palavra-chave case:

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

Embora isso possa parecer com as instruções switch de outras linguagens, a correspondência de padrões começa a brilhar quando você também usa outros padrões. Um deles é o padrão de variável, que permite atribuir um valor a uma variável. Neste exemplo, a variável i receberá o valor de number se ele não for 0:

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

Em alguns casos, você pode querer adicionar uma condição extra a um padrão. Isso é conhecido como uma guarda (cláusula), que pode ser adicionada com a palavra-chave if:

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

Por questões de desempenho, apenas operadores matemáticos e booleanos básicos são permitidos em guardas; outras funções não podem ser usadas nelas.

No exemplo acima, nem toda entrada possível terá um padrão correspondente. O compilador vai detectar isso e emitir um erro. Isso é conhecido como verificação de exaustividade. Para resolver o aviso, é preciso tratar todos os casos. Para isso, pode-se usar o padrão de descarte, que é um padrão que corresponde a qualquer valor:

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

// No compiler error

É possível corresponder a vários padrões em uma única cláusula, usando | para separar cada padrão. Só é possível adicionar uma guarda por cláusula:

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

As expressões case testam um valor contra cada padrão, de cima para baixo, até encontrar um padrão correspondente e executar a lógica associada a ele. A ordem dos padrões importa!

Instruções

Neste exercício, você está jogando um jogo de adivinhação de números com um amigo. As regras são simples: você escolhe um número em segredo entre 1 e 100, e seu amigo tenta adivinhar qual número você escolheu. Para ajudar seu amigo, você responde de forma diferente dependendo de quão perto o palpite chegou do número que você escolheu (42). Estas são as regras para as diferentes respostas:

  • Se o palpite for 42: "Correct"
  • Se o palpite for 41 ou 43: "So close"
  • Se o palpite for menor que 41: "Too low"
  • Se o palpite for maior que 43: "Too high"

Você tem quatro tarefas para codificar as respostas aos palpites.

1. Responda a um palpite correto

Implemente a função reply para responder a um palpite correto:

reply(42)
// -> "Correct"

2. Responda a um palpite próximo

Modifique a função reply para responder a palpites próximos:

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

3. Responda a palpites muito baixos

Modifique a função reply para responder a palpites muito baixos:

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

4. Responda a palpites muito altos

Modifique a função reply para responder a palpites muito altos:

reply(88)
// -> "Too high"
Editar via GitHub O link abre em uma nova janela ou aba
Gleam Exercism

Tudo pronto para começar Jogo de adivinhação?

Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.