Gerencie a lista de maiores pontuações de um jogador.
Sua tarefa é construir um component de pontuação do clássico Frogger, um dos jogos mais vendidos e mais viciantes de todos os tempos, e um clássico da era dos fliperamas. Você vai escrever métodos que retornem a maior pontuação da lista, a última pontuação adicionada e as três maiores pontuações.
Este exercício exige que a saída seja ordenada de uma forma específica. Como em muitas linguagens de programação, iterar sobre um array acontece em uma ordem que depende da implementação e que parece aleatória. Normalmente, não é isso que as pessoas querem ver. O GNU awk oferece alguns recursos 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 em questão no próprio local.
Isso é mais útil para arrays indexados numericamente.
O processo que preenche o array sorted descarta os índices originais do array:
o array sorted é 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" 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 em uma ordem específica.
O array interno PROCINFO contém muitas informações sobre o processo awk em execução.
Um elemento interessante desse array é sorted_in.
O valor dessa chave do array é o nome de uma função que controla a ordem em que os índices do array serão processados pelos laços for (indx in array).
A função pode ser o nome de uma função definida por você, ou você pode usar algumas funções de ordenação predefinidas bem práticas, entre elas:
"@ind_str_asc", "@ind_str_desc": ordenam o array pelo índice, em ordem alfabética, crescente ou decrescente."@ind_num_asc", "@ind_num_desc": ordenam o array pelo índice, em ordem numérica, crescente ou decrescente."@val_str_asc", "@val_str_desc": ordenam o array pelo valor, em ordem alfabética, crescente ou decrescente."@val_num_asc", "@val_num_desc": ordenam o array pelo valor, em ordem numérica, crescente ou decrescente.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
Esse método permite evitar o array temporário sorted e o valor de retorno n.
Simples e organizado.
A função de ordenação definida por você 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 de retorno é:
idx1 vem antes de idx2
idx1 vem depois de idx2
Além de PROCINFO["sorted_in"] para controlar a ordem de for (idx in array), tanto asort quanto asorti podem receber o nome de uma função de comparação como terceiro parâmetro.
Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.