Υψηλό σκορ

Υψηλό σκορ

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

Εισαγωγή

Χάρτες

Στην Elixir, οι χάρτες είναι η δομή δεδομένων για την αποθήκευση πληροφοριών σε ζεύγη κλειδιού-τιμής. Σε άλλες γλώσσες, αυτοί μπορεί να είναι γνωστοί και ως συσχετιστικοί πίνακες (PHP), hashes (Perl 5, Raku) ή λεξικά (Python).

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

Μορφές literal

Ένας κενός χάρτης δηλώνεται απλά με %{}. Αν θέλουμε να προσθέσουμε στοιχεία σε ένα literal χάρτη, μπορούμε να χρησιμοποιήσουμε δύο μορφές:

# If the key is an atom:
%{atom_key: 1}

# If the key is a different type:
%{1 => :atom_value}

# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}

Αν και δεν υπάρχει καθιερωμένη μορφή, διάλεξε έναν συνεπή τρόπο για να αναπαριστάς τα ζεύγη κλειδιού-τιμής.

Συναρτήσεις του module Map

Η Elixir παρέχει πολλές συναρτήσεις για την εργασία με χάρτες στο module Map. Κάποιες συναρτήσεις του module Map απαιτούν να περαστεί μια ανώνυμη συνάρτηση στη συνάρτηση για να βοηθήσει στον μετασχηματισμό του χάρτη.

Χαρακτηριστικά module ως σταθερές

Στην Elixir, μπορούμε να ορίσουμε χαρακτηριστικά module που μπορούν να χρησιμοποιηθούν ως σταθερές στις συναρτήσεις μας.

defmodule Example do
  # Defines the attribute as the value 1
  @constant_number 1

  def example_value() do
    # Returns the value 1
    @constant_number
  end
end

Όταν χρησιμοποιούνται για τον ορισμό σταθερών module, τα χαρακτηριστικά μπορούν να είναι οποιαδήποτε έκφραση που μπορεί να αξιολογηθεί κατά τη μεταγλώττιση. Μετά τη μεταγλώττιση, τα χαρακτηριστικά module δεν είναι προσπελάσιμα, καθώς επεκτείνονται κατά τη μεταγλώττιση, παρόμοια με τα macros που ορίζονται σε γλώσσες όπως η C.

Οδηγίες

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

1. Όρισε έναν νέο map υψηλών σκορ

Για να φτιάξεις έναν νέο map υψηλών σκορ, όρισε τη συνάρτηση HighScore.new/0, η οποία δεν παίρνει κανένα όρισμα και επιστρέφει έναν νέο, κενό map υψηλών σκορ.

HighScore.new()
# => %{}

2. Πρόσθεσε παίκτες στον map υψηλών σκορ

Για να προσθέσεις έναν παίκτη στον map υψηλών σκορ, όρισε τη συνάρτηση HighScore.add_player/3, η οποία παίρνει 3 ορίσματα:

  • Το πρώτο όρισμα είναι ο map με τα σκορ.
  • Το δεύτερο όρισμα είναι το όνομα του παίκτη ως συμβολοσειρά.
  • Το τρίτο όρισμα είναι το σκορ ως ακέραιος αριθμός. Το όρισμα είναι προαιρετικό, υλοποίησε το τρίτο όρισμα με προεπιλεγμένη τιμή 0.

Αποθήκευσε το προεπιλεγμένο αρχικό σκορ σε ένα χαρακτηριστικό ενότητας. Θα το χρειαστείς ξανά.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}

3. Αφαίρεσε παίκτες από τον map υψηλών σκορ

Για να αφαιρέσεις έναν παίκτη από τον map υψηλών σκορ, όρισε τη συνάρτηση HighScore.remove_player/2, η οποία παίρνει 2 ορίσματα:

  • Το πρώτο όρισμα είναι ο map με τα σκορ.
  • Το δεύτερο όρισμα είναι το όνομα του παίκτη ως συμβολοσειρά.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}

4. Επανάφερε το σκορ ενός παίκτη

Για να επαναφέρεις το σκορ ενός παίκτη, όρισε τη συνάρτηση HighScore.reset_score/2, η οποία παίρνει 2 ορίσματα:

  • Το πρώτο όρισμα είναι ο map με τα σκορ.
  • Το δεύτερο όρισμα είναι το όνομα του παίκτη ως συμβολοσειρά, του οποίου το σκορ θέλεις να επαναφέρεις.

Η συνάρτηση θα πρέπει να δουλεύει και αν ο παίκτης δεν έχει σκορ.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}

5. Ενημέρωσε το σκορ ενός παίκτη

Για να ενημερώσεις το σκορ ενός παίκτη προσθέτοντας στο προηγούμενο σκορ, όρισε τη συνάρτηση HighScore.update_score/3, η οποία παίρνει 3 ορίσματα:

  • Το πρώτο όρισμα είναι ο map με τα σκορ.
  • Το δεύτερο όρισμα είναι το όνομα του παίκτη ως συμβολοσειρά, του οποίου το σκορ θέλεις να ενημερώσεις.
  • Το τρίτο όρισμα είναι το σκορ που θέλεις να προσθέσεις στο αποθηκευμένο υψηλό σκορ.

Η συνάρτηση θα πρέπει να δουλεύει και αν ο παίκτης δεν έχει προηγούμενο σκορ - υπέθεσε ότι το προηγούμενο σκορ είναι 0.

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}

6. Πάρε μια λίστα με παίκτες

Για να πάρεις μια λίστα με παίκτες, όρισε τη συνάρτηση HighScore.get_players/1, η οποία παίρνει 1 όρισμα:

  • Το πρώτο όρισμα είναι ο map με τα σκορ.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elixir Exercism

Έτοιμος να ξεκινήσεις την άσκηση Υψηλό σκορ;

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