Track
/
Elm
Elm
/
Esercizi
/
Le carte Blorkemon
Le carte Blorkemon

Le carte Blorkemon

Esercizio di apprendimento

Introduzione

Confronto

Uguaglianza

I tipi di Elm possono essere controllati per «essere uguali» con l'operatore di uguaglianza (==). L'operatore di disuguaglianza è (/=) (non != come in molti linguaggi). L'operatore di uguaglianza funziona su letterali, tuple, record e tipi personalizzati.

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

Tieni presente che non dovresti mai confrontare le funzioni, perché così il programma andrà in crash a runtime.

Confronti

Gli operatori di confronto (<), (<=), (>), (>=) e le funzioni min, max, compare funzionano con i tipi comparable. Il tipo comparable è un tipo speciale che raggruppa tutti i tipi predefiniti che si possono confrontare: numeri, caratteri, stringhe, liste di elementi comparabili e tuple di elementi comparabili.

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

I valori di altri tipi, come i record o i tipi personalizzati, non possono essere confrontati direttamente.

Alcuni tipi predefiniti richiedono che il loro contenuto sia comparable, come le chiavi di Set o Dict, poiché la loro struttura si basa su un ordinamento interno.

Le liste di valori comparable possono essere ordinate con List.sort e le liste di valori che possono essere mappati a valori comparabili possono essere ordinate con List.sortBy. Se hai bisogno di un ordinamento gerarchico (ordina per una proprietà e risolvi i pareggi con un'altra), anche tuple o liste possono essere usate con List.sortBy, poiché tuple e liste vengono ordinate in ordine lessicografico.

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 funzione compare prende due valori comparable e restituisce un Order. Un Order è un tipo che permette di verificare in una sola operazione se un valore è maggiore (GT), uguale (EQ) o minore (LT) di un altro.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Le funzioni di confronto possono essere costruite per tipi arbitrari e usate, per esempio, per ordinare 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]

Istruzioni

Ti senti improvvisamente assalire da un'ondata di nostalgia e da una forte voglia di rispolverare le tue vecchie carte Blorkemon™️. Blorkemon™️ cards è un fantastico gioco di scambio carte in stile old school. Ogni Card ha un mostro Blorkemon™️ disegnato sopra, insieme a un livello di potenza d'attacco, e se sei fortunato, la carta potrebbe persino essere lucente.

1. Confronta i livelli di potenza

Ogni carta Blorkemon™️ sembra più potente della successiva, ma è meglio controllare.

Implementa la funzione isMorePowerful. Dovrebbe restituire True se la carta passata come primo argomento è strettamente più potente dell'altra, e False altrimenti.

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

isMorePowerful newthree scientuna
    --> True

2. Trova la potenza più alta

Con una mano piena di carte Blorkemon™️, dovresti riuscire a preparare l'attacco più devastante.

Implementa la funzione maxPower, che restituisce il livello di potenza più alto tra due carte.

maxPower newthree scientuna
    --> 120

3. Ordina le carte

A quanto pare ricordi di avere almeno una carta di ogni Blorkemon™️, ma è passato un po' di tempo dall'ultima volta che hai controllato: dovresti ordinare le tue carte per confrontarle con l'elenco ufficiale su Pulpapedia.

Implementa la funzione sortByMonsterName, che dovrebbe prendere un array di Cards e restituire un array ordinato per nomi dei mostri.

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

4. Prima le carte più cool

I Blorkemon™️ sono la cosa più cool di sempre. Non stai usando quel termine alla leggera: hai un metodo scientifico per dimostrarlo.

Implementa la funzione sortByCoolness, che ordina un array di carte mettendo per prime le più cool. Il grado di cool di una carta è determinato prima di tutto dalla sua lucentezza: tutte le carte lucenti sono decisamente più cool delle altre. Il secondo fattore è il livello di potenza: più è alto, meglio è.

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

5. Potere lucente

La lucentezza non è solo apparenza: in una battaglia tra Blorkemon™️ di pari potenza, uno lucente avrà sempre la meglio. Questo si chiama potere lucente.

Implementa la funzione compareShinyPower, che codifica questa proprietà. L'Order di due carte è determinato dai livelli di potenza se sono diversi, ma se sono uguali, una carta lucente sarà maggiore.

compareShinyPower newthree scientuna
    --> GT

6. Fai le tue scommesse

In una partita a carte Blorkemon™️, tutto può succedere, ma le carte più potenti tendono comunque a vincere.

Implementa la funzione expectedWinner che restituisce il nome del mostro che ha più probabilità di vincere, in base all'ordinamento di compareShinyPower. La funzione dovrebbe restituire il nome del mostro vincitore previsto, oppure «too close to call» se entrambi gli avversari hanno lo stesso potere lucente.

expectedWinner newthree scientuna
    --> "Newthree"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elm Exercism

Vuoi iniziare Le carte Blorkemon?

Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.