Tracks
/
Gleam
Gleam
/
Ejercicios
/
Juego de adivinanzas
Juego de adivinanzas

Juego de adivinanzas

Ejercicio de aprendizaje

Introducción

Expresiones case

En Gleam, una expresión case se puede usar para ejecutar código de forma condicional. Con una expresión case, un valor se puede probar contra uno o más patrones. Un ejemplo de esos patrones es el patrón literal, que compara un valor con un valor literal (por ejemplo, 1 o "hello").

Las expresiones case se escriben con la palabra clave case:

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

Aunque esto pueda parecer una sentencia switch de otros lenguajes, la coincidencia de patrones empieza a brillar cuando también se usan otros patrones. Uno de ellos es el patrón de variable, que permite asignar un valor a una variable. En este ejemplo, a la variable i se le asignará el valor de number si este no es 0:

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

En algunos casos, quizás quieras agregar una condición adicional a un patrón. Esto se conoce como guarda (cláusula) y se puede agregar con la palabra clave if:

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

Por razones de rendimiento, en las guardas solo se permiten operadores matemáticos y booleanos básicos; no se pueden usar otras funciones en las guardas.

En el ejemplo anterior, no todos los argumentos posibles tendrán un patrón que coincida. El compilador lo detectará y mostrará un error. Esto se conoce como comprobación exhaustiva. Para resolver la advertencia, hay que manejar todos los casos. Para eso se puede usar el patrón de descarte, que es un patrón que coincide con cualquier valor:

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

// No compiler error

Se pueden comparar varios patrones en una misma cláusula usando | para separar cada patrón. Solo se puede agregar una 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

Las expresiones case prueban un valor contra cada patrón de arriba hacia abajo, hasta encontrar un patrón que coincida y ejecutar la lógica asociada a ese patrón. ¡El orden de los patrones importa!

Instrucciones

En este ejercicio vas a jugar con alguien a adivinar un número. Las reglas son simples: eliges en secreto un número entre 1 y 100 y esa persona intenta adivinar qué número elegiste. Para ayudarla, respondes de forma distinta según qué tan cerca esté su intento del número que elegiste (42). Estas son las reglas para las distintas respuestas:

  • Si el intento es 42: "Correct"
  • Si el intento es 41 o 43: "So close"
  • Si el intento es menor que 41: "Too low"
  • Si el intento es mayor que 43: "Too high"

Tienes cuatro tareas para implementar las respuestas a los intentos.

1. Responde a un intento correcto

Implementa la función reply para responder a un intento correcto:

reply(42)
// -> "Correct"

2. Responde a un intento cercano

Modifica la función reply para responder a intentos cercanos:

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

3. Responde a intentos demasiado bajos

Modifica la función reply para responder a intentos demasiado bajos:

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

4. Responde a intentos demasiado altos

Modifica la función reply para responder a intentos demasiado altos:

reply(88)
// -> "Too high"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Gleam Exercism

¿Todo listo para empezar Juego de adivinanzas?

Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.