Percursos
/
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 desigualdade é (/=) (não !=, como em muitas linguagens). O operador de igualdade funciona com literais, tuplos, registos 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

Repara que nunca deves comparar funções, pois isso faz com que o programa rebente em tempo de execução.

Comparações

Os operadores de comparação (<), (<=), (>), (>=) e as funções min, max e compare funcionam com tipos comparable. O tipo comparable é um tipo especial que agrupa todos os tipos incorporados que podem ser comparados: números, carateres, strings, listas de elementos comparáveis e tuplos de elementos 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")

Os valores de outros tipos, como registos ou tipos personalizados, não podem ser comparados diretamente.

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

As listas de valores comparable podem ser ordenadas com List.sort e as listas de valores que podem ser mapeados para valores comparáveis podem ser ordenadas com List.sortBy. Se precisares de uma ordenação hierárquica (ordenar por uma propriedade e desempatar com outra), também podes usar tuplos ou listas com List.sortBy, uma vez que os tuplos e as listas são ordenados por 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 devolve um Order. Um Order é um tipo que verifica, numa única operação, se um valor é maior (GT), igual (EQ) ou menor (LT) do que outro.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

É possível construir funções de comparação para tipos arbitrários e usá-las, 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, sentes uma onda de nostalgia e uma vontade enorme de tirar o pó às tuas velhas cartas Blorkemon™️. As cartas Blorkemon™️ são um excelente jogo de troca de cartas à moda antiga. Cada Card tem um monstro Blorkemon™️ desenhado, juntamente com um nível de poder de ataque e, se tiveres sorte, a carta pode até ser brilhante.

1. Compara os níveis de poder

Cada carta Blorkemon™️ parece mais poderosa do que a seguinte, mas é melhor verificares.

Implementa a função isMorePowerful. Deve devolver True se a carta no seu primeiro argumento for estritamente mais poderosa do que a outra, e False caso contrário.

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

isMorePowerful newthree scientuna
    --> True

2. Encontra o poder mais alto

Com uma mão cheia de cartas Blorkemon™️, deves ser capaz de preparar o ataque mais devastador.

Implementa a função maxPower, que devolve o nível de poder mais alto de duas cartas.

maxPower newthree scientuna
    --> 120

3. Ordena as cartas

Parece que te lembras de ter pelo menos uma carta de cada Blorkemon™️, mas já passou algum tempo desde a última vez que verificaste. Deves ordenar as tuas cartas para as comparares com a listagem oficial na Pulpapedia.

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

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

4. As cartas mais fixes primeiro

Os Blorkemon™️ são a coisa mais fixe de sempre. Não estás a usar esse termo de ânimo leve, tens um método científico para o demonstrar.

Implementa a função sortByCoolness, que ordena uma lista de cartas colocando as mais fixes primeiro. O quão fixe é uma carta determina-se primeiro pelo seu brilho: todas as cartas brilhantes são muito mais fixes do que as outras. O segundo fator é o nível de poder: quanto mais alto, melhor.

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

5. Shiny Power

O brilho não é só para exibir. Numa batalha entre Blorkemon™️ com o mesmo poder, o brilhante prevalece sempre. A isto chama-se Shiny Power.

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

compareShinyPower newthree scientuna
    --> GT

6. Faz as tuas apostas

Num jogo de cartas Blorkemon™️, tudo pode acontecer, mas há ainda uma tendência para as cartas mais poderosas ganharem.

Implementa a função expectedWinner, que devolve o nome do monstro com mais probabilidades de ganhar, segundo a ordenação de compareShinyPower. A função deve devolver o nome do monstro do vencedor esperado, ou "too close to call" se ambos os oponentes tiverem o mesmo Shiny Power.

expectedWinner newthree scientuna
    --> "Newthree"
Editar via GitHub A ligação abre numa nova janela ou separador
Elm Exercism

Estás pronto para começar Cartas Blorkemon?

Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.