Track
/
AWK
AWK
/
Esercizi
/
Punteggi migliori
Punteggi migliori

Punteggi migliori

Facile

Istruzioni

Gestisci l'array dei punteggi più alti di un giocatore.

Il tuo compito è costruire un componente per i punteggi più alti del classico gioco Frogger, uno dei giochi più venduti e più avvincenti di tutti i tempi, nonché un classico dell'epoca delle sale giochi. Il tuo compito è scrivere dei metodi che restituiscono il punteggio più alto dell'array, l'ultimo punteggio aggiunto e i tre punteggi più alti.

Ordinamento in AWK

Questo esercizio richiede che l'output sia ordinato in un modo particolare. Come in molti linguaggi di programmazione, l'iterazione su un array avviene in un ordine che dipende dall'implementazione e che sembra casuale. Di solito non è quello che gli esseri umani vogliono vedere. GNU awk offre alcune funzionalità di ordinamento.

  1. asort: ordina un array con indici numerici in base ai valori dell'array.

    #!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]
    }
    

    che produce

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

    La forma n = asort(array) ordina sul posto l'array indicato.

    È particolarmente utile per gli array con indici numerici. Il processo che popola l'array sorted scarta gli indici originali dell'array: l'array sorted è indicizzato da 1 a n.

  2. asorti: ordina un array in base agli indici dell'array.

    La funzione asorti popola un array «di destinazione» che contiene gli indici ordinati dell'array «di origine».

    #!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]]
    }
    

    che produce

    unordered
    foo 92
    qux 30
    bar 59
    ordered by index
    bar 59
    foo 92
    qux 30
    
  3. PROCINFO["sorted_in"]: percorre un array in un ordine specificato.

    L'array predefinito PROCINFO contiene molte informazioni sul processo awk in esecuzione Un elemento interessante di questo array è sorted_in Il valore di questa chiave dell'array è il nome di una funzione che controlla l'ordine in cui gli indici dell'array verranno elaborati dai cicli for (indx in array).

    La funzione può essere il nome di una funzione definita dall'utente, oppure esistono alcune comode funzioni di ordinamento predefinite, tra cui:

    • "@ind_str_asc", "@ind_str_desc": ordina l'array per indice, usando un ordinamento alfabetico, in senso crescente o decrescente.
    • "@ind_num_asc", "@ind_num_desc": ordina l'array per indice, usando un ordinamento numerico, in senso crescente o decrescente.
    • "@val_str_asc", "@val_str_desc": ordina l'array per valore, usando un ordinamento alfabetico, in senso crescente o decrescente.
    • "@val_num_asc", "@val_num_desc": ordina l'array per valore, usando un ordinamento numerico, in senso crescente o decrescente.

    L'esempio con asort qui sopra si può implementare così:

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

    L'esempio con asorti si può scrivere così:

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

    Questo metodo ci permette di evitare l'array temporaneo sorted e il valore restituito n. Ordinato e pulito.

Funzione di ordinamento definita dall'utente

La funzione di ordinamento definita dall'utente accetta 4 parametri: l'indice e il valore di un elemento dell'array e l'indice e il valore di un altro elemento dell'array:

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

Il valore restituito è:

  • minore di zero: idx1 viene prima di idx2
  • maggiore di zero: idx1 viene dopo idx2
  • zero: gli indici hanno la stessa precedenza di ordinamento, ma il loro ordine relativo non è definito.

Oltre a PROCINFO["sorted_in"] per controllare l'ordine di for (idx in array), sia asort sia asorti possono accettare come terzo parametro il nome di una funzione di confronto.

Riferimenti


Fonte

Omaggio al videogioco arcade degli anni Ottanta Frogger
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
AWK Exercism

Vuoi iniziare Punteggi migliori?

Iscriviti a Exercism per imparare e padroneggiare AWK con 3 concetti92 esercizi e il mentoring di persone reali, tutto gratis.