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.
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.
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.
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
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.
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:
idx1 va antes de idx2
idx1 va después de idx2
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.
Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.