Tracks
/
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 principio de abierto-cerrado al permitir que las funciones tengan múltiples cláusulas; así, en lugar de recurrir a una lógica de control extensa y escrita a mano, se pueden escribir funciones específicas que agreguen o quiten comportamiento con facilidad.

Elixir ofrece múltiples cláusulas de función y guardas que te permiten 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 evalúa, de arriba hacia abajo del archivo fuente, qué cláusula de función invocar.

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

Guardas

Las guardas se usan para evitar que Elixir invoque funciones a partir de la evaluación de los argumentos que hacen las 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 estrictamente true o false.

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

Argumentos por defecto

Las funciones pueden declarar valores por defecto para uno o más argumentos. Consideremos esta función:

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

Al compilar, 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 valor por defecto, esos valores se aplican a la función de izquierda a derecha para completar los argumentos que faltan.

Si la función tiene más de una cláusula, los argumentos por defecto deben definirse en un encabezado 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 muy sencillo en el que un amigo puede adivinar un número secreto. Quieres dar algo de retroalimentación, pero sin revelar la respuesta con un intento. Necesitas diseñar una función que dé respuestas distintas según 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"

Todos los intentos y los números secretos son números enteros.

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

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

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

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

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

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

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

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

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

4. Genera las respuestas cuando el intento es 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 hay ningún intento

Modifica la función compare para que responda cuando no hay 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 una pestaña nuevas
Elixir Exercism

¿Todo 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.