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

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

Εύκολο

Οδηγίες

Διαχειρίσου τη λίστα υψηλών σκορ ενός παίκτη.

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

Ταξινόμηση στην AWK

Αυτή η άσκηση απαιτεί η έξοδος να είναι ταξινομημένη με έναν συγκεκριμένο τρόπο. Όπως σε πολλές γλώσσες προγραμματισμού, η επανάληψη πάνω σε έναν πίνακα γίνεται με σειρά που εξαρτάται από την υλοποίηση και μοιάζει τυχαία. Αυτό συνήθως δεν είναι αυτό που θέλουν να βλέπουν οι άνθρωποι. Το GNU awk παρέχει κάποιες δυνατότητες ταξινόμησης.

  1. asort -- ταξινομεί έναν πίνακα με αριθμητικές θέσεις με βάση τις τιμές του πίνακα.

    #!gawk 
    BEGIN {
        for (i = 1; i <= 5; i++)
            nums[i] = int(100 * rand())
    
        # returns the array size
        n = asort(nums, sorted)
    
        for (i = 1; i <= n; i++)
            print i, nums[i], sorted[i]
    }
    

    που παράγει

    1 92 30
    2 59 57
    3 30 59
    4 57 74
    5 74 92
    

    Η μορφή n = asort(array) ταξινομεί τον συγκεκριμένο πίνακα επί τόπου.

    Αυτό είναι ιδιαίτερα χρήσιμο για πίνακες με αριθμητικές θέσεις. Η διαδικασία που γεμίζει τον πίνακα sorted απορρίπτει τις αρχικές θέσεις του πίνακα: ο πίνακας sorted έχει θέσεις από το 1 ως το n.

  2. asorti -- ταξινομεί έναν πίνακα με βάση τις θέσεις του πίνακα.

    Η συνάρτηση asorti γεμίζει έναν πίνακα "προορισμού" που περιέχει τις θέσεις του πίνακα "πηγής", ταξινομημένες.

    #!gawk
    BEGIN {
        nums["foo"] = int(100 * rand())
        nums["bar"] = int(100 * rand())
        nums["qux"] = int(100 * rand())
    
        print "unordered"
        for (i in nums)
            print i, nums[i]
    
        print "ordered by index"
        n = asorti(nums, sorted)
        for (i = 1; i <= n; i++)
            print sorted[i], nums[sorted[i]]
    }
    

    που παράγει

    unordered
    foo 92
    qux 30
    bar 59
    ordered by index
    bar 59
    foo 92
    qux 30
    
  3. PROCINFO["sorted_in"] -- διατρέχει έναν πίνακα με καθορισμένη σειρά.

    Ο ενσωματωμένος πίνακας PROCINFO περιέχει πολλές πληροφορίες για τη διεργασία awk που εκτελείται Ένα ενδιαφέρον στοιχείο αυτού του πίνακα είναι το sorted_in Η τιμή αυτού του κλειδιού του πίνακα είναι το όνομα μιας συνάρτησης που ελέγχει τη σειρά με την οποία οι θέσεις του πίνακα θα επεξεργαστούν από τους βρόχους for (indx in array).

    Η συνάρτηση μπορεί να είναι το όνομα μιας συνάρτησης ορισμένης από τον χρήστη, ή υπάρχουν και κάποιες βολικές προκαθορισμένες συναρτήσεις ταξινόμησης, όπως:

    • "@ind_str_asc", "@ind_str_desc" - ταξινομούν τον πίνακα με βάση τη θέση, με αλφαβητική ταξινόμηση, σε αύξουσα ή φθίνουσα σειρά.
    • "@ind_num_asc", "@ind_num_desc" - ταξινομούν τον πίνακα με βάση τη θέση, με αριθμητική ταξινόμηση, σε αύξουσα ή φθίνουσα σειρά.
    • "@val_str_asc", "@val_str_desc" - ταξινομούν τον πίνακα με βάση την τιμή, με αλφαβητική ταξινόμηση, σε αύξουσα ή φθίνουσα σειρά.
    • "@val_num_asc", "@val_num_desc" - ταξινομούν τον πίνακα με βάση την τιμή, με αριθμητική ταξινόμηση, σε αύξουσα ή φθίνουσα σειρά.

    Το παραπάνω παράδειγμα με την asort μπορεί να υλοποιηθεί ως εξής:

    PROCINFO["sorted_in"] = "@val_num_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    3 30
    4 57
    2 59
    5 74
    1 92
    

    Το παράδειγμα με την asorti μπορεί να γραφτεί ως εξής:

    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    bar 59
    foo 92
    qux 30
    

    Αυτή η μέθοδος μας επιτρέπει να αποφύγουμε τον προσωρινό πίνακα sorted και την τιμή επιστροφής n. Καθαρή και τακτοποιημένη δουλειά.

Συνάρτηση ταξινόμησης ορισμένη από τον χρήστη

Η συνάρτηση ταξινόμησης που ορίζει ο χρήστης δέχεται 4 παραμέτρους: τη θέση και την τιμή ενός στοιχείου του πίνακα και τη θέση και την τιμή ενός άλλου στοιχείου του πίνακα:

function compare(idx1, val1, idx2, val2) {...}

Η τιμή επιστροφής είναι:

  • μικρότερη από το μηδέν: το idx1 έρχεται πριν από το idx2
  • μεγαλύτερη από το μηδέν: το idx1 έρχεται μετά το idx2
  • μηδέν: οι θέσεις έχουν την ίδια προτεραιότητα ταξινόμησης, αλλά η μεταξύ τους σειρά είναι απροσδιόριστη.

Εκτός από το PROCINFO["sorted_in"] για τον έλεγχο της σειράς του for (idx in array), τόσο η asort όσο και η asorti μπορούν να δεχτούν το όνομα μιας συνάρτησης σύγκρισης ως 3η παράμετρο.

Αναφορές


Πηγή

Φόρος τιμής στο arcade παιχνίδι Frogger της δεκαετίας του '80
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
AWK Exercism

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

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