Rutas
/
Elixir
Elixir
/
Ejercicios
/
Juego de adivinanzas
Juego de adivinanzas

Juego de adivinanzas

Ejercicio de aprendizaje

Introducción

Funciones con múltiples cláusulas

Elixir facilita las prácticas del Open-Closed Principle al permitir que las funciones tengan múltiples cláusulas, de modo que, en lugar de repartir y escribir de forma rígida la lógica de control, se pueden escribir funciones concretas para añadir o quitar comportamiento con facilidad.

Elixir ofrece múltiples cláusulas de función y guardas para escribir:

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

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

En tiempo de ejecución, Elixir comprobará, de arriba a abajo del archivo fuente, qué cláusula de función invocar.

Las variables que no se usan deben ir precedidas de un guion bajo.

Guardas

Las guardas se usan para evitar que Elixir invoque funciones basándose en la evaluación de los argumentos mediante funciones de guarda. Las guardas comienzan con la palabra clave when, seguida de una expresión booleana. Las funciones de guarda son funciones especiales que:

  • Deben ser puras y no modificar ningún estado global.
  • Deben devolver valores true o false estrictos.

Puedes encontrar una lista de guardas habituales en la documentación de Elixir. Incluye comprobaciones de tipo, aritmética básica, comparaciones y operadores estrictamente booleanos.

Argumentos predeterminados

Las funciones pueden declarar valores predeterminados para uno o varios argumentos. Veamos esta función:

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

Al compilarse, Elixir crea una definición de función para number/0 (sin argumentos) y number/1 (un argumento).

Si más de un argumento tiene valores predeterminados, los valores predeterminados se aplicarán a la función de izquierda a derecha para rellenar los argumentos que falten.

Si la función tiene más de una cláusula, los argumentos predeterminados deben definirse en una cabecera de función (una función sin cuerpo) antes de las cláusulas de la función:

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

Instrucciones

Estás creando un juego en línea sencillo en el que un amigo puede adivinar un número secreto. Quieres dar algún comentario, pero sin desvelar la respuesta con un intento. Necesitas idear una función que proporcione respuestas diferentes en función de cómo se relacione el intento con el número secreto.

Condición Respuesta
Cuando el intento coincide con el número secreto "Correct"
Cuando el intento es uno más o uno menos que el número secreto "So close"
Cuando el intento es mayor que el número secreto "Too high"
Cuando el intento es menor que el número secreto "Too low"
Cuando no se hace ningún intento "Make a guess"

Tanto los intentos como los números secretos son números enteros.

1. Genera la respuesta cuando el intento coincida con el número secreto

Implementa la función compare/2, que recibe dos argumentos, secret_number y guess, ambos números enteros.

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

2. Genera la respuesta cuando el intento sea mayor que el número secreto

Modifica la función compare para que responda a los intentos que sean mayores que el número secreto.

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

3. Genera la respuesta cuando el intento sea menor que el número secreto

Modifica la función compare para que responda a los intentos que sean menores que el número secreto.

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

4. Genera las respuestas cuando el intento sea uno más o uno menos que el número secreto

Modifica la función compare para que responda a los intentos que estén cerca del número secreto.

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

5. Genera la respuesta cuando no haya ningún intento

Modifica la función compare para que responda cuando no haya ningún intento.

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

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Juego de adivinanzas?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.