Trilhas
/
Elm
Elm
/
Exercícios
/
Cartas Blorkemon
Cartas Blorkemon

Cartas Blorkemon

Exercício de aprendizagem

Introdução

Comparação

Igualdade

Os tipos de Elm podem ser verificados quanto a "serem iguais" com o operador de igualdade (==). O operador de diferença é (/=) (não != como em muitas linguagens). O operador de igualdade funciona com literais, tuplas, registros e 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

Repare que você nunca deve comparar funções, pois isso fará o programa quebrar em tempo de execução.

Comparações

Os operadores de comparação (<), (<=), (>), (>=) e as funções min, max, compare funcionam com tipos comparable. O tipo comparable é um tipo especial que agrupa todos os tipos embutidos que podem ser comparados: números, caracteres, strings, listas de coisas comparáveis e tuplas de coisas comparáveis.

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")

Valores de outros tipos, como registros ou tipos personalizados, não podem ser comparados diretamente.

Alguns tipos embutidos exigem que seu conteúdo seja comparable, como as chaves de Set ou Dict, já que sua estrutura depende de uma ordenação interna.

Listas de valores comparable podem ser ordenadas com List.sort, e listas de valores que podem ser mapeados para valores comparáveis podem ser ordenadas com List.sortBy. Se você precisar de uma ordenação hierárquica (ordenar por uma propriedade e desempatar com outra), tuplas ou listas também podem ser usadas com List.sortBy, já que tuplas e listas são ordenadas em ordem lexicográfica.

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"]

A função compare recebe dois valores comparable e retorna um Order. Um Order é um tipo que verifica em uma única operação se um valor é maior (GT), igual (EQ) ou menor (LT) que outro.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Funções de comparação podem ser construídas para tipos arbitrários e usadas, por exemplo, para ordenar com 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]

Instruções

De repente, você sente um acesso de nostalgia e uma forte vontade de tirar o pó das suas velhas cartas de Blorkemon™️. Blorkemon™️ cards é um ótimo jogo de troca de cartas à moda antiga. Cada Card tem um monstro Blorkemon™️ desenhado, junto com um nível de poder de ataque e, se você tiver sorte, a carta pode até ser brilhante.

1. Compare os níveis de poder

Cada carta de Blorkemon™️ parece mais poderosa que a anterior, mas é melhor você conferir.

Implemente a função isMorePowerful. Ela deve retornar True se a carta do primeiro argumento for estritamente mais poderosa que a outra, e False caso contrário.

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

isMorePowerful newthree scientuna
    --> True

2. Encontre o maior poder

Com uma mão cheia de cartas de Blorkemon™️, você deve conseguir preparar o ataque mais devastador.

Implemente a função maxPower, que retorna o maior nível de poder entre duas cartas.

maxPower newthree scientuna
    --> 120

3. Ordene as cartas

Parece que você se lembra de ter pelo menos uma carta de cada Blorkemon™️, mas já faz um tempo desde a última vez que você conferiu. Você deve ordenar suas cartas para compará-las com a lista oficial na Pulpapedia.

Implemente a função sortByMonsterName, que deve receber uma lista de Cards e retornar uma lista ordenada pelos nomes dos monstros.

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

4. As cartas mais legais primeiro

Os Blorkemon™️ são a coisa mais legal que existe. Você não está usando esse termo à toa. Você tem um método científico para comprovar isso.

Implemente a função sortByCoolness, que ordena uma lista de cartas colocando as mais legais primeiro. O quão legal uma carta é, em primeiro lugar, é determinado pelo seu brilho: todas as cartas brilhantes são muito mais legais que as outras. O segundo fator é o nível de poder, quanto maior, melhor.

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

5. Poder Brilhante

O brilho não é só enfeite: em uma batalha entre Blorkemon™️ com o mesmo poder, o brilhante sempre leva a melhor. Isso se chama Poder Brilhante.

Implemente a função compareShinyPower, que codifica essa propriedade. A Order de duas cartas é determinada pelos níveis de poder, se forem diferentes, mas, se forem iguais, uma carta brilhante será maior.

compareShinyPower newthree scientuna
    --> GT

6. Faça suas apostas

Em um jogo de cartas Blorkemon™️, tudo pode acontecer, mas ainda há uma tendência de as cartas mais poderosas vencerem.

Implemente a função expectedWinner, que retorna o nome do monstro com maior expectativa de vitória, de acordo com a ordenação de compareShinyPower. A função deve retornar o nome do monstro do provável vencedor, ou "too close to call" se os dois oponentes tiverem o mesmo Poder Brilhante.

expectedWinner newthree scientuna
    --> "Newthree"
Editar via GitHub O link abre em uma nova janela ou aba
Elm Exercism

Tudo pronto para começar Cartas Blorkemon?

Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.