Percursos
/
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

Em Gleam, podes usar uma expressão case para executar código condicionalmente. Com uma expressão case, podes testar um valor 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 escrevem-se com a palavra-chave case:

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

Embora isto possa parecer-se com instruções switch noutras linguagens, a correspondência de padrões começa a destacar-se quando também usas outros padrões. Um desses padrões é o padrão variável, que te permite atribuir um valor a uma variável. Neste exemplo, à variável i será atribuído o valor de number se este não for 0:

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

Nalguns casos, podes querer adicionar uma condição adicional a um padrão. Isto é 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 razões de desempenho, só são permitidos operadores matemáticos e booleanos básicos nas guardas. Não podes usar outras funções nas guardas.

No exemplo acima, nem todos os valores de entrada possíveis têm um padrão correspondente. O compilador deteta isto e emite um erro. Isto é conhecido como verificação exaustiva. Para resolveres o aviso, tens de tratar todos os casos. Para isso, podes 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

Podes comparar vários padrões numa só cláusula, usando | para separar cada padrão. Só podes 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é encontrarem um padrão correspondente e executarem a lógica associada a esse padrão. A ordem dos padrões é importante!

Instruções

Neste exercício, vais jogar um jogo de adivinhar números com um amigo. As regras são simples: escolhes secretamente um número entre 1 e 100 e o teu amigo tenta adivinhar que número escolheste. Para ajudar o teu amigo, respondes de forma diferente consoante a proximidade do palpite ao número que escolheste (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"

Tens quatro tarefas para codificar as respostas aos palpites.

1. Responde a um palpite correto

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

reply(42)
// -> "Correct"

2. Responde a um palpite próximo

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

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

3. Responde a palpites demasiado baixos

Altera a função reply para responder a palpites demasiado baixos:

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

4. Responde a palpites demasiado altos

Altera a função reply para responder a palpites demasiado altos:

reply(88)
// -> "Too high"
Editar via GitHub A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Jogo de adivinhação?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.