Percursos
/
Elixir
Elixir
/
Exercícios
/
Jogo de adivinhação
Jogo de adivinhação

Jogo de adivinhação

Exercício de aprendizagem

Introdução

Funções com várias cláusulas

O Elixir facilita as práticas do Princípio Aberto-Fechado ao permitir que as funções tenham várias cláusulas. Assim, em vez de uma lógica de controlo extensa e fixa no código, podes escrever funções direcionadas que adicionam ou removem comportamento com facilidade.

O Elixir oferece várias cláusulas de função e guardas para escreveres:

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

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

Em tempo de execução, o Elixir testa, de cima para baixo do ficheiro de código, qual a cláusula de função a invocar.

As variáveis que não são usadas devem ser precedidas por um underscore.

Guardas

As guardas servem para impedir que o Elixir invoque funções, com base na avaliação dos argumentos feita pelas funções de guarda. As guardas começam com a palavra-chave when, seguida de uma expressão booleana. As funções de guarda são funções especiais que:

  • Têm de ser puras e não podem alterar quaisquer estados globais.
  • Têm de devolver estritamente valores true ou false.

Encontras uma lista de guardas comuns na documentação do Elixir. Inclui verificação de tipos, aritmética básica, comparações e operadores estritamente booleanos.

Argumentos predefinidos

As funções podem declarar valores predefinidos para um ou mais argumentos. Vamos considerar esta função:

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

Quando é compilado, o Elixir cria uma definição de função para number/0 (sem argumentos) e number/1 (um argumento).

Se mais do que um argumento tiver valores predefinidos, os valores predefinidos são aplicados à função da esquerda para a direita, para preencher os argumentos em falta.

Se a função tiver mais do que uma cláusula, os argumentos predefinidos devem ser definidos num cabeçalho de função (uma função sem corpo) antes das cláusulas da função:

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

Instruções

Estás a criar um jogo online simples em que um amigo pode adivinhar um número secreto. Queres dar algum feedback, mas sem revelar a resposta com um palpite. Precisas de criar uma função que devolva respostas diferentes conforme a relação entre o palpite e o número secreto.

Condição Resposta
Quando o palpite coincide com o número secreto "Correct"
Quando o palpite é mais um ou menos um do que o número secreto "So close"
Quando o palpite é maior do que o número secreto "Too high"
Quando o palpite é menor do que o número secreto "Too low"
Quando não é feito nenhum palpite "Make a guess"

Todos os palpites e números secretos são números inteiros.

1. Devolve a resposta quando o palpite coincide com o número secreto

Implementa a função compare/2, que recebe dois argumentos, secret_number e guess, ambos números inteiros.

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

2. Devolve a resposta quando o palpite é maior do que o número secreto

Modifica a função compare para responder a palpites maiores do que o número secreto.

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

3. Devolve a resposta quando o palpite é menor do que o número secreto

Modifica a função compare para responder a palpites menores do que o número secreto.

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

4. Devolve as respostas quando o palpite é mais um ou menos um do que o número secreto

Modifica a função compare para responder a palpites próximos do número secreto.

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

5. Devolve a resposta quando não há palpite

Modifica a função compare para responder à ausência de palpite.

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

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

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

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.