Gere a lista de pontuações altas de um jogador.
A tua tarefa é criar o component de pontuação alta do clássico jogo Frogger, um dos jogos mais vendidos e mais viciantes de todos os tempos e um clássico da era dos jogos de arcada. A tua tarefa é escrever métodos que devolvem a pontuação mais alta da lista, a última pontuação adicionada e as três pontuações mais altas.
Este exercício exige que o resultado seja ordenado de uma forma específica. Tal como em muitas linguagens de programação, iterar sobre um array segue uma ordem que depende da implementação e que parece aleatória. Normalmente, não é isto que queremos ver. O GNU awk disponibiliza algumas funcionalidades de ordenação.
asort: ordena um array indexado numericamente com base nos valores do 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 produz
1 92 30
2 59 57
3 30 59
4 57 74
5 74 92
A forma n = asort(array) ordena o array indicado no próprio local.
Isto é especialmente útil para arrays indexados numericamente.
O processo que preenche o array sorted descarta os índices originais do array:
o array sorted fica indexado de 1 a n.
asorti: ordena um array com base nos índices do array.
A função asorti preenche um array de "destino" com os índices do array de "origem", já 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 produz
unordered
foo 92
qux 30
bar 59
ordered by index
bar 59
foo 92
qux 30
PROCINFO["sorted_in"]: percorre um array numa ordem especificada.
O array incorporado PROCINFO contém muita informação sobre o processo awk em execução.
Um elemento interessante deste array é sorted_in.
O valor desta chave do array é o nome de uma função que controla a ordem pela qual os índices do array são processados pelos ciclos for (indx in array).
A função pode ser o nome de uma função definida pelo utilizador, ou podes usar algumas funções de ordenação predefinidas bastante úteis, entre as quais:
"@ind_str_asc", "@ind_str_desc" - ordena o array por índice; usa
ordenação alfabética; ordem ascendente ou descendente."@ind_num_asc", "@ind_num_desc" - ordena o array por índice; usa
ordenação numérica; ordem ascendente ou descendente."@val_str_asc", "@val_str_desc" - ordena o array por valor; usa
ordenação alfabética; ordem ascendente ou descendente."@val_num_asc", "@val_num_desc" - ordena o array por valor; usa
ordenação numérica; ordem ascendente ou descendente.O exemplo de asort acima pode ser implementado assim:
PROCINFO["sorted_in"] = "@val_num_asc"
for (idx in nums)
print idx, nums[idx]
3 30
4 57
2 59
5 74
1 92
O exemplo de asorti pode ser escrito assim:
PROCINFO["sorted_in"] = "@ind_str_asc"
for (idx in nums)
print idx, nums[idx]
bar 59
foo 92
qux 30
Este método permite-nos evitar o array temporário sorted e o valor devolvido n.
Simples e limpo.
A função de ordenação definida pelo utilizador recebe 4 parâmetros: o índice e o valor de um elemento do array e o índice e o valor de outro elemento do array:
function compare(idx1, val1, idx2, val2) {...}
O valor devolvido é:
idx1 vem antes de idx2
idx1 vem depois de idx2
Além de PROCINFO["sorted_in"] para controlar a ordem do ciclo for (idx in array),
tanto asort como asorti podem receber o nome de uma função de comparação como terceiro parâmetro.
Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.