Tracks
/
AWK
AWK
/
Ejercicios
/
Puntajes altos
Puntajes altos

Puntajes altos

Fácil

Instrucciones

Administra la lista de puntajes altos de un jugador.

Tu tarea es crear el componente de puntajes altos del clásico juego Frogger, uno de los juegos más vendidos y más adictivos de todos los tiempos, y un clásico de la era de los arcades. Tu tarea es escribir métodos que devuelvan el puntaje más alto de la lista, el último puntaje agregado y los tres puntajes más altos.

Ordenamiento en AWK

Este ejercicio requiere que la salida esté ordenada de una manera particular. Como en muchos lenguajes de programación, recorrer un array ocurre en un orden que depende de la implementación y que parece aleatorio. Por lo general, esto no es lo que los humanos quieren ver. GNU awk ofrece algunas funcionalidades de ordenamiento.

  1. asort: ordena un array con índices numéricos según los valores del 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]
    }
    

    que genera la siguiente salida

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

    La forma n = asort(array) ordena el array indicado en el lugar.

    Esto es muy útil para arrays con índices numéricos. El proceso que llena el array sorted descarta los índices originales del array: el array sorted queda indexado del 1 a n.

  2. asorti: ordena un array según los índices del array.

    La función asorti llena un array «destino» con los índices del array «origen» ya ordenados.

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

    que genera la siguiente salida

    unordered
    foo 92
    qux 30
    bar 59
    ordered by index
    bar 59
    foo 92
    qux 30
    
  3. PROCINFO["sorted_in"]: recorre un array en un orden específico.

    El array integrado PROCINFO contiene mucha información sobre el proceso de awk en ejecución. Un elemento interesante de este array es sorted_in. El valor de esta clave del array es el nombre de una función que controla el orden en que los bucles for (indx in array) procesarán los índices del array.

    La función puede ser el nombre de una función definida por el usuario, o bien puedes usar algunas funciones de ordenamiento predefinidas muy útiles, entre ellas:

    • "@ind_str_asc", "@ind_str_desc": ordenan el array por índice; usan orden alfabético; ordenan de forma ascendente o descendente.
    • "@ind_num_asc", "@ind_num_desc": ordenan el array por índice; usan orden numérico; ordenan de forma ascendente o descendente.
    • "@val_str_asc", "@val_str_desc": ordenan el array por valor; usan orden alfabético; ordenan de forma ascendente o descendente.
    • "@val_num_asc", "@val_num_desc": ordenan el array por valor; usan orden numérico; ordenan de forma ascendente o descendente.

    El ejemplo de asort anterior se puede implementar así:

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

    El ejemplo de asorti se puede escribir así:

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

    Este método nos permite evitar el array temporal sorted y el valor de retorno n. Sencillo y ordenado.

Función de ordenamiento definida por el usuario

La función de ordenamiento definida por el usuario recibe 4 parámetros: el índice y el valor de un elemento del array, y el índice y el valor de otro elemento del array:

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

El valor de retorno es:

  • menor que cero: idx1 va antes de idx2
  • mayor que cero: idx1 va después de idx2
  • cero: los índices tienen la misma prioridad de ordenamiento, pero su orden relativo no está definido.

Además de PROCINFO["sorted_in"] para controlar el orden de for (idx in array), tanto asort como asorti pueden recibir el nombre de una función de comparación como tercer parámetro.

Referencias


Fuente

Tributo al juego de arcade Frogger de los años ochenta
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
AWK Exercism

¿Todo listo para empezar Puntajes altos?

Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.