Rutas
/
AWK
AWK
/
Ejercicios
/
Puntuaciones máximas
Puntuaciones máximas

Puntuaciones máximas

Fácil

Instrucciones

Gestiona la lista de puntuaciones altas de un jugador.

Tu tarea es construir un componente de puntuación alta del clásico juego Frogger, uno de los juegos más vendidos y más adictivos de todos los tiempos, y todo un clásico de la era de los salones recreativos. Tu tarea es escribir métodos que devuelvan la puntuación más alta de la lista, la última puntuación añadida y las tres puntuaciones más altas.

Ordenar en AWK

Este ejercicio requiere que la salida se ordene de una forma concreta. Como ocurre en muchos lenguajes de programación, iterar sobre un array se hace en un orden que depende de la implementación y que parece aleatorio. Normalmente, esto no es lo que quieres ver. GNU awk ofrece algunas funcionalidades de ordenación.

  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 produce 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 propio array.

    Esto resulta especialmente útil con arrays de índices numéricos. El proceso que rellena el array sorted descarta los índices originales del array: el array sorted se indexa del 1 a n.

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

    La función asorti rellena un array «de destino» que contiene los índices del array «de origen» 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 produce 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 determinado.

    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 el que los bucles for (indx in array) procesan los índices del array.

    La función puede ser el nombre de una función definida por el usuario, o bien puedes usar algunas prácticas funciones de ordenación predefinidas, entre las que se incluyen:

    • "@ind_str_asc", "@ind_str_desc" - ordena el array por índice; usa ordenación alfabética; ordena de forma ascendente o descendente.
    • "@ind_num_asc", "@ind_num_desc" - ordena el array por índice; usa ordenación numérica; ordena de forma ascendente o descendente.
    • "@val_str_asc", "@val_str_desc" - ordena el array por valor; usa ordenación alfabética; ordena de forma ascendente o descendente.
    • "@val_num_asc", "@val_num_desc" - ordena el array por valor; usa ordenación numérica; ordena 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 te permite evitar el array temporal sorted y el valor devuelto n. Limpio y ordenado.

Funciones de ordenación definidas por el usuario

La función de ordenación 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 devuelto es:

  • menor que cero: idx1 va antes que idx2
  • mayor que cero: idx1 va después que idx2
  • cero: los índices tienen la misma prioridad de ordenación, 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

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

¿Listo para empezar Puntuaciones máximas?

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