Διαδρομές
/
Common Lisp
Common Lisp
/
Ασκήσεις
/
Υψηλές Βαθμολογίες
Υψηλές Βαθμολογίες

Υψηλές Βαθμολογίες

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

Εισαγωγή

Πίνακες κατακερματισμού

Οι πίνακες κατακερματισμού στην Common Lisp είναι δομές δεδομένων για την αποθήκευση συσχετιστικών δεδομένων. Αντιστοιχίζουν κλειδιά (που μπορεί να είναι οποιοδήποτε αντικείμενο) σε τιμές (που μπορεί επίσης να είναι οποιοδήποτε αντικείμενο). Άλλες γλώσσες μπορεί να αναφέρονται σε αυτή την έννοια ως χάρτες, λεξικά ή κατακερματισμούς.

Δημιουργία πινάκων κατακερματισμού

Οι πίνακες κατακερματισμού μπορούν να δημιουργηθούν με τη συνάρτηση make-hash-table.

(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>

(Σημείωσε ότι η εκτυπωμένη μορφή ενός πίνακα κατακερματισμού εξαρτάται από την υλοποίηση, οπότε μπορεί να εμφανιστεί διαφορετικά στο REPL σου.)

Ανάκτηση τιμών με βάση τα κλειδιά

Για να πάρεις μια τιμή με βάση ένα κλειδί από τον πίνακα κατακερματισμού, χρησιμοποιείς τη συνάρτηση gethash:

*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
                   ;    T

Το gethash επιστρέφει πολλαπλές τιμές, οι οποίες θα εξηγηθούν σε άλλη ενότητα.

Εισαγωγή τιμών

Για να εισάγεις μια τιμή σε έναν πίνακα κατακερματισμού, χρησιμοποιείς το setf μαζί με το gethash, όπως εδώ:

(setf (gethash :foo *hash-table*) :bar) : => :bar

Αυτό θα αλλάξει την τιμή για το κλειδί :foo στον πίνακα κατακερματισμού *hash-table* σε :bar. Επιστρέφει την τιμή.

Η χρήση του setf θα εξηγηθεί σε άλλη ενότητα.

Οδηγίες

Ο Lamont είναι ένας εξωγήινος από τη Lisp που θέλει να γράψει το δικό του βιντεοπαιχνίδι. Ένα από τα πράγματα για τα οποία σου ζήτησε βοήθεια είναι να κρατάς μια λίστα με τις υψηλές βαθμολογίες.

1. Δημιουργία του πίνακα υψηλών βαθμολογιών

Όρισε μια συνάρτηση make-high-score-table που δεν παίρνει κανένα όρισμα και αποτιμάται σε έναν νέο κενό πίνακα κατακερματισμού:

(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>

2. Προσθήκη παίκτη στον πίνακα

Για να προσθέσεις έναν παίκτη στον πίνακα, όρισε μια συνάρτηση add-player που παίρνει δύο ορίσματα:

  • τον πίνακα υψηλών βαθμολογιών
  • το όνομα του παίκτη ως λέξη-κλειδί

Όρισε την αρχική βαθμολογία του παίκτη σε μηδέν.

(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0

3. Ορισμός της βαθμολογίας ενός παίκτη

Για να ορίσεις τη βαθμολογία ενός παίκτη, όρισε μια συνάρτηση set-score που παίρνει τρία ορίσματα:

  • τον πίνακα υψηλών βαθμολογιών
  • το όνομα του παίκτη ως λέξη-κλειδί
  • τη βαθμολογία του παίκτη ως ακέραιο
(set-score hash-table :louis 1234) ; => 1234

4. Ανάκτηση βαθμολογίας από τον πίνακα

Για να πάρεις τη βαθμολογία ενός παίκτη από τον πίνακα, όρισε μια συνάρτηση get-score που παίρνει δύο ορίσματα:

  • τον πίνακα υψηλών βαθμολογιών
  • το όνομα του παίκτη ως λέξη-κλειδί

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

(get-score hash-table :louis)                         ; => 1234
(get-score hash-table :lilly)                         ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0

5. Αφαίρεση παίκτη από τον πίνακα

Για να αφαιρέσεις έναν παίκτη από τον πίνακα υψηλών βαθμολογιών, όρισε μια συνάρτηση remove-player που παίρνει δύο ορίσματα:

  • τον πίνακα υψηλών βαθμολογιών
  • το όνομα του παίκτη ως λέξη-κλειδί

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

(set-score hash-table :louis 1234)           ; => 1234
(remove-player hash-table :louis)            ; => T
(get-score hash-table :louis)                ; => 0

(remove-player hash-table :not-in-the-table) ; => NIL
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Common Lisp Exercism

Έτοιμος να ξεκινήσεις την άσκηση Υψηλές Βαθμολογίες;

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