Rutas
/
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 se puede comprobar un valor contra uno o varios patrones. Un ejemplo de ese tipo de patrón es el patrón literal, que hace coincidir 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 instrucciones switch de otros lenguajes, la coincidencia de patrones empieza a destacar cuando se usan también otros patrones. Uno de esos patrones 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 no es 0:

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

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

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

Por motivos 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 todas las entradas 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 cubrir todos los casos. Para ello 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

En una misma cláusula se puede hacer coincidir varios patrones usando | para separarlos. Solo se puede añadir 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 comprueban un valor contra cada patrón de arriba 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 juegas a adivinar un número con un amigo. Las reglas son sencillas: eliges en secreto un número entre 1 y 100 y tu amigo intenta adivinar qué número has elegido. Para ayudarle, respondes de forma distinta según lo cerca que esté la conjetura del número que has elegido (42). Estas son las reglas para las distintas respuestas:

  • Si la conjetura es 42: «Correct»
  • Si la conjetura es 41 o 43: «So close»
  • Si la conjetura es menor que 41: «Too low»
  • Si la conjetura es mayor que 43: «Too high»

Tienes cuatro tareas para programar las respuestas a las conjeturas.

1. Responder a una conjetura correcta

Implementa la función reply para responder a una conjetura correcta:

reply(42)
// -> "Correct"

2. Responder a una conjetura cercana

Modifica la función reply para responder a las conjeturas cercanas:

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

3. Responder a conjeturas demasiado bajas

Modifica la función reply para responder a las conjeturas demasiado bajas:

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

4. Responder a conjeturas demasiado altas

Modifica la función reply para responder a las conjeturas demasiado altas:

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

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