Διαδρομές
/
Elm
Elm
/
Ασκήσεις
/
Κάρτες Blorkemon
Κάρτες Blorkemon

Κάρτες Blorkemon

Άσκηση εκμάθησης

Εισαγωγή

Σύγκριση

Ισότητα

Οι τύποι της Elm μπορούν να ελεγχθούν για το αν "είναι ίδιοι" με τον τελεστή ισότητας (==). Ο τελεστής ανισότητας είναι το (/=) (όχι το != όπως σε πολλές γλώσσες). Ο τελεστής ισότητας λειτουργεί σε literals, πλειάδες, καταγραφές και προσαρμοσμένους τύπους.

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

Σημείωσε ότι δεν πρέπει ποτέ να συγκρίνεις συναρτήσεις, γιατί αυτό θα κάνει το πρόγραμμα να καταρρεύσει κατά την εκτέλεση.

Συγκρίσεις

Οι τελεστές σύγκρισης (<), (<=), (>), (>=) και οι συναρτήσεις min, max, compare λειτουργούν σε τύπους comparable. Ο τύπος comparable είναι ένας ειδικός τύπος που ομαδοποιεί όλους τους ενσωματωμένους τύπους που μπορούν να συγκριθούν: αριθμούς, χαρακτήρες, συμβολοσειρές, λίστες από συγκρίσιμα πράγματα και πλειάδες από συγκρίσιμα πράγματα.

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

Τιμές άλλων τύπων, όπως οι καταγραφές ή οι προσαρμοσμένοι τύποι, δεν μπορούν να συγκριθούν απευθείας.

Κάποιοι ενσωματωμένοι τύποι απαιτούν το περιεχόμενό τους να είναι comparable, όπως τα κλειδιά των Set ή Dict, αφού η δομή τους βασίζεται σε μια εσωτερική διάταξη.

Οι λίστες με comparable τιμές μπορούν να ταξινομηθούν με το List.sort και οι λίστες με τιμές που μπορούν να αντιστοιχιστούν σε συγκρίσιμες τιμές μπορούν να ταξινομηθούν με το List.sortBy. Αν χρειάζεσαι ιεραρχική ταξινόμηση (ταξινόμηση με βάση μία ιδιότητα και λύση των ισοπαλιών με μια άλλη), μπορείς να χρησιμοποιήσεις πλειάδες ή λίστες με το List.sortBy, αφού οι πλειάδες και οι λίστες ταξινομούνται με λεξικογραφική σειρά.

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

Η συνάρτηση compare παίρνει δύο comparable τιμές και επιστρέφει ένα Order. Ένα Order είναι ένας τύπος που ελέγχει με μία μόνο πράξη αν μια τιμή είναι μεγαλύτερη (GT), ίση (EQ) ή μικρότερη (LT) από μια άλλη.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

Μπορείς να κατασκευάσεις συναρτήσεις σύγκρισης για οποιουσδήποτε τύπους και να τις χρησιμοποιήσεις, για παράδειγμα, για ταξινόμηση με το 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]

Οδηγίες

Ξαφνικά νιώθεις ένα κύμα νοσταλγίας και μια έντονη επιθυμία να ξεσκονίσεις τις παλιές σου κάρτες Blorkemon™️. Οι κάρτες Blorkemon™️ είναι ένα υπέροχο, παλιό καλό παιχνίδι ανταλλαγής καρτών. Κάθε Card έχει πάνω της ζωγραφισμένο ένα τέρας Blorkemon™️, μαζί με ένα επίπεδο δύναμης επίθεσης, και αν είσαι τυχερός, η κάρτα μπορεί να είναι ακόμα και λαμπερή.

1. Σύγκρινε τα επίπεδα δύναμης

Κάθε κάρτα Blorkemon™️ φαίνεται πιο δυνατή από την επόμενη, αλλά καλύτερα να το ελέγξεις.

Υλοποίησε τη συνάρτηση isMorePowerful. Θα πρέπει να επιστρέφει True αν η κάρτα στο πρώτο της όρισμα είναι αυστηρά πιο δυνατή από την άλλη, και False διαφορετικά.

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

isMorePowerful newthree scientuna
    --> True

2. Βρες τη μεγαλύτερη δύναμη

Με ένα χέρι γεμάτο κάρτες Blorkemon™️, θα πρέπει να μπορείς να προετοιμάσεις την πιο καταστροφική επίθεση.

Υλοποίησε τη συνάρτηση maxPower, η οποία επιστρέφει το υψηλότερο επίπεδο δύναμης από δύο κάρτες.

maxPower newthree scientuna
    --> 120

3. Ταξινόμησε τις κάρτες

Θυμάσαι μάλλον ότι είχες τουλάχιστον μία κάρτα από κάθε Blorkemon™️, αλλά έχει περάσει καιρός από την τελευταία φορά που το τσέκαρες, οπότε καλύτερα να ταξινομήσεις τις κάρτες σου για να τις συγκρίνεις με την επίσημη λίστα στο Pulpapedia.

Υλοποίησε τη συνάρτηση sortByMonsterName, η οποία θα πρέπει να παίρνει μια λίστα από Cards και να επιστρέφει μια λίστα ταξινομημένη κατά όνομα τέρατος.

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

4. Οι πιο κουλ κάρτες πρώτα

Τα Blorkemon™️ είναι ό,τι πιο κουλ υπάρχει. Δεν χρησιμοποιείς αυτόν τον χαρακτηρισμό απερίσκεπτα, έχεις μια επιστημονική μέθοδο για να το αποδείξεις.

Υλοποίησε τη συνάρτηση sortByCoolness, η οποία ταξινομεί μια λίστα καρτών βάζοντας πρώτες τις πιο κουλ. Η κουλότητα μιας κάρτας καθορίζεται πρώτα από τη λάμψη της: όλες οι λαμπερές κάρτες είναι πολύ πιο κουλ από τις υπόλοιπες. Ο δεύτερος παράγοντας είναι το επίπεδο δύναμης, όσο υψηλότερο τόσο το καλύτερο.

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

5. Λαμπερή Δύναμη

Η λάμψη δεν είναι μόνο για επίδειξη: σε μια μάχη ανάμεσα σε Blorkemon™️ με ίση δύναμη, το λαμπερό θα υπερισχύσει πάντα. Αυτό ονομάζεται Λαμπερή Δύναμη.

Υλοποίησε τη συνάρτηση compareShinyPower, η οποία κωδικοποιεί αυτή την ιδιότητα. Η Order δύο καρτών καθορίζεται από τα επίπεδα δύναμης αν αυτά είναι διαφορετικά, αλλά αν είναι ίσα, μια λαμπερή κάρτα θα είναι μεγαλύτερη.

compareShinyPower newthree scientuna
    --> GT

6. Βάλε τα στοιχήματά σου

Σε ένα παιχνίδι με κάρτες Blorkemon™️, όλα επιτρέπονται, αλλά υπάρχει ακόμα μια τάση οι πιο δυνατές κάρτες να κερδίζουν.

Υλοποίησε τη συνάρτηση expectedWinner που επιστρέφει το όνομα του τέρατος με τις περισσότερες πιθανότητες να κερδίσει, όπως καθορίζεται από τη διάταξη της compareShinyPower. Η συνάρτηση θα πρέπει να επιστρέφει το όνομα του τέρατος του αναμενόμενου νικητή, ή "too close to call" αν και οι δύο αντίπαλοι έχουν την ίδια Λαμπερή Δύναμη.

expectedWinner newthree scientuna
    --> "Newthree"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elm Exercism

Έτοιμος να ξεκινήσεις την άσκηση Κάρτες Blorkemon;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.