Tracks
/
Elm
Elm
/
Ejercicios
/
Cartas de Blorkemon
Cartas de Blorkemon

Cartas de Blorkemon

Ejercicio de aprendizaje

Introducción

Comparación

Igualdad

Puedes comprobar si dos valores de Elm «son lo mismo» con el operador de igualdad (==). El operador de desigualdad es (/=) (no != como en muchos lenguajes). El operador de igualdad funciona con literales, tuplas, records y tipos personalizados.

1 == 2
    --> False

1 /= 2
    --> True

(1, 2) == (2, 1)
    --> False

type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]

type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings =  (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}

a == b
    --> True

Ten en cuenta que nunca debes comparar funciones, ya que esto hará que el programa falle en tiempo de ejecución.

Comparaciones

Los operadores de comparación (<), (<=), (>), (>=) y las funciones min, max, compare funcionan con tipos comparable. El tipo comparable es un tipo especial que agrupa todos los tipos integrados que se pueden comparar: números, caracteres, strings, listas de cosas comparables y tuplas de cosas comparables.

1 < 1 + 1
    --> True

'x' < 'X'
    --> False

"abc" < "abz"
    --> True

"abc" < "abcd"
    --> True

"abc" < "b"
    --> True

min [1 , 2, 9000] [10]
    --> [1 , 2, 9000]

min (1, "hello") (3, "bye")
    --> (1, "hello")

Los valores de otros tipos, como los records o los tipos personalizados, no se pueden comparar directamente.

Algunos tipos integrados requieren que su contenido sea comparable, como las claves de Set o Dict, ya que su estructura depende de un orden interno.

Las listas de valores comparable se pueden ordenar con List.sort, y las listas de valores que se pueden transformar en valores comparables se pueden ordenar con List.sortBy. Si necesitas una ordenación jerárquica (ordenar por una propiedad y desempatar con otra), también puedes usar tuplas o listas con List.sortBy, ya que las tuplas y las listas se ordenan en orden lexicográfico.

List.sort ["hi", "hello", "bye", "goodbye"]
    --> ["bye", "goodbye", "hello", "hi"]

List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
    --> ["hi", "bye", "hello", "goodbye"]

-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
    --> ["hi", "bye", "dad", "mum", "sis", "hello"]

La función compare toma dos valores comparable y devuelve un Order. Un Order es un tipo que comprueba en una sola operación si un valor es mayor (GT), igual (EQ) o menor (LT) que otro.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Se pueden construir funciones de comparación para tipos arbitrarios y usarlas, por ejemplo, para ordenar con List.sortWith:

type Color = Red | Green | Blue

compareColors : Color -> Color -> Order
compareColors a b =
  case (a, b) of
    (Red, Red) -> EQ
    (Red, _) -> LT
    (_, Red) -> GT
    (Green, Green) -> EQ
    (Green, _) -> LT
    (_, Green) -> GT
    (Blue, Blue) -> EQ

List.sortWith compareColors [Blue, Red, Green, Green, Blue]
    --> [Red, Green, Green, Blue, Blue]

Instrucciones

De repente sientes un arrebato de nostalgia y unas ganas enormes de desempolvar tus viejas cartas de Blorkemon™️. Las cartas de Blorkemon™️ son un gran juego de intercambio de cartas de la vieja escuela. Cada Card tiene dibujado un monstruo Blorkemon™️, junto con un nivel de poder de ataque y, si tienes suerte, la carta hasta podría ser brillante.

1. Compara los niveles de poder

Cada carta de Blorkemon™️ parece más poderosa que la anterior, pero es mejor que lo verifiques.

Implementa la función isMorePowerful. Debe devolver True si la carta de su primer argumento es estrictamente más poderosa que la otra, y False en caso contrario.

newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True

isMorePowerful newthree scientuna
    --> True

2. Encuentra el poder más alto

Con una mano llena de cartas de Blorkemon™️, deberías poder preparar el ataque más devastador.

Implementa la función maxPower, que devuelve el nivel de poder más alto de dos cartas.

maxPower newthree scientuna
    --> 120

3. Ordena las cartas

Parece que recuerdas que tenías al menos una carta de cada Blorkemon™️, pero ha pasado bastante tiempo desde la última vez que lo revisaste; deberías ordenar tus cartas para compararlas con el listado oficial de Pulpapedia.

Implementa la función sortByMonsterName, que debe tomar una lista de Cards y devolver una lista ordenada por los nombres de los monstruos.

sortByMonsterName [newthree, scientuna]
    --> [Card "Newthree" 120 False, Card "Scientuna" 6 True]

4. Las cartas más geniales primero

Los Blorkemon™️ son lo más genial que existe. No usas ese término a la ligera: tienes un método científico para demostrarlo.

Implementa la función sortByCoolness, que ordena una lista de cartas colocando primero las más geniales. La genialidad de una carta se determina primero por su brillo: todas las cartas brillantes son mucho más geniales que las demás. El segundo factor es el nivel de poder; cuanto más alto, mejor.

sortByCoolness [newthree, scientuna]
    --> [Card "Scientuna" 6 True, Card "Newthree" 120 False]

5. Poder Brillante

El brillo no es solo apariencia: en una batalla entre Blorkemon™️ con el mismo poder, uno brillante siempre se impondrá. A esto se le llama el Poder Brillante.

Implementa la función compareShinyPower, que codifica esta propiedad. El Order de dos cartas se determina por los niveles de poder si son diferentes, pero si son iguales, una carta brillante será mayor.

compareShinyPower newthree scientuna
    --> GT

6. Haz tus apuestas

En una partida de cartas de Blorkemon™️ todo se vale, pero sigue existiendo una tendencia a que ganen las cartas más poderosas.

Implementa la función expectedWinner, que devuelve el nombre del monstruo con más probabilidades de ganar, según el orden de compareShinyPower. La función debe devolver el nombre del monstruo del ganador esperado, o «too close to call» si ambos oponentes tienen el mismo Poder Brillante.

expectedWinner newthree scientuna
    --> "Newthree"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elm Exercism

¿Todo listo para empezar Cartas de Blorkemon?

Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.